0

再利用可能なUIクラスを作成しようとしています。私はそれがどのように機能するべきか理解していないことを認めます。引数を渡すクラスが必要です。ユーザーが選択すると、選択した値が返されます。これは実際には、使用されるより複雑なカスタムダイアログになります。テストのために、私が見つけた例から次のコードをまとめると、選択した値を返す以外はすべて実行されます。

では、どうすればユーザーが選択した値をメインルーチンに戻すことができますか?

メインモジュールパッケージcom.mine.zd;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class ZDialogActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View arg0){
                go();
            }
        });
    }

    private void go()
    {
       final String[] vOptions = { "One", "Two", "Three" } ;

       myOptions.getmenuOptions(
        ZDialogActivity.this, "Select Mode", vOptions,
            new android.content.DialogInterface.OnClickListener(){
               @Override
               public void onClick(DialogInterface dialog, int which) {
                  Log.w("TEST", "which=" + which );
               }
            }
       );
    }
}

モジュールと呼ばれる

package com.mine.zd;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.util.Log;

public class myOptions {

    public static void getmenuOptions(Context context, String msg,
         String[] vOptions, OnClickListener neutralClickListener){

        new AlertDialog.Builder(context)
        .setTitle("Select Mode")
        .setItems(vOptions, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {              
                Log.w("TEST", "item=" + whichButton );
                dialog.dismiss();
            }
        })
        .setNeutralButton("Cancel", neutralClickListener )
        .create().show();
    }
}

返された「キャンセル」ボタンの値は-3ですが、オプションのIDを選択する必要があります。

4

1 に答える 1

1

これはどうですか?

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.your.package.MyOptions.MyDialogClickListener;

public class ZDialogActivity extends Activity implements View.OnClickListener, MyDialogClickListener {

    private MyOptions options;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.btn1).setOnClickListener(this);

        String[] vOptions = { "One", "Two", "Three" };
        options = new MyOptions(vOptions, this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn1:
            go();
            break;
        default:
            Log.e("TEST", "Unhandled onClick");
            break;
        }
    }

    private void go() {
        options.getMenuOptions(this, "Select Mode");
    }

    @Override
    public void onMyDialogClick(String option){
        Log.d("TEST", "item=" + option);
    }
}

そしてあなたのヘルパークラス:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;

public class MyOptions implements OnClickListener {

    private final MyDialogClickListener listener;
    private final String[] options;

    public interface MyDialogClickListener {
        void onMyDialogClick(String option);
    }

    public MyOptions(String[] options, MyDialogClickListener listener) {
        this.options = options;
        this.listener = listener;
    }

    public void getMenuOptions(Context context, String msg)  {
        new AlertDialog.Builder(context)
            .setTitle(msg)
            .setItems(options, this)
            .setNeutralButton("Cancel", this)
            .create()
            .show();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if(listener != null)
            listener.onMyDialogClick(options[which]);
        dialog.dismiss();
    }
}

1)クラス名は大文字で始めます

2)静的ヘルパーメソッドを使用しないでください。このシナリオではクラスをインスタンス化することをお勧めします。

3)次に、変更されないフィールドをコンストラクターに渡すことができます

4)インターフェイスを使用してクラス間でメッセージを送信します(アクティビティはダイアログonClickイベントのリスナーとして機能します)

5)迷惑なonClickリスナーを使用しないでください。クラスに実装させ、ビューIDをオンにして、クリックされたものを特定します。

お役に立てば幸いです。

于 2012-06-09T23:29:59.423 に答える