0

DialogFragment のダイアログを返すために使用される AlertDialog のメソッド setPositiveButton() 内の Fragment からメソッドを呼び出したいのですが、それはできません。

Fragment を拡張する Test という名前のクラス内にメソッド doSomething() があります。このクラスの内部には、DialogFragment を拡張する内部クラスがあります。メソッド onCreateDialog で問題が発生します。コードを見てください:

public class Test extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = inflater.inflate(R.layout.activity_main, null);
    return view;
}

public static class SelectDeviceDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
        .setPositiveButton(R.string.ok,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                ((Test) getTargetFragment()).doSomething();
            }
        }).create();
    }
}

private void doSomething() {}
}

DialogFragment と Fragment は、lib android.support.v4 からのものです。

Test へのキャストができないため、エラーが発生します。その場合、メソッド doSomething をどのように呼び出すことができますか?

ありがとう。

4

1 に答える 1

0

私の答えを修正するには、2 つのルートがあります。1 つ目は、次のように static クラスを final 宣言に変更することです。

public final DialogFragment selectDeviceDialogFragment = new DialogFragment(){
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                doSomething();
                            }
                        }).create();
    }    
};

それが適切でなく、本当に static 宣言が必要な場合は、インターフェイスを使用して通信する必要があります。静的クラスを使用しているため、この DialogFragment を別の Fragment から呼び出していると想定してください。その場合、私はこのルートに行きます:

public interface DoSomething{
     public void doSomething();
}

アクティビティで DoSomething インターフェースを実装する必要があります。

private class MyActivity extends Activity implements DoSomething{

    /** other methods **/

    @Override
    public void doSomething() {
        FragmentManager fragmentManager = getFragmentManager();
        Test frag = (Test)fragmentManager.findFragmentById(/*the fragment id*/);
        frag.doSomething();
    }
}

内部ダイアログ クラスの Test フラグメントに戻ります。

public static class SelectDeviceDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                MyActivity activity = (MyActivity)getActivity();
                                activity.doSomething();
                            }
                        }).create();
    }
}

今回はあなたの質問に答えられたことを願っています:)

于 2012-08-27T19:31:17.460 に答える