0

私は Java と Android の両方の初心者ですが、これは Android で明らかになった Java に関する質問だと思います。

Android サポート パッケージ (android.support.v4.app) を使用し、FragmentActivity を拡張する MyActivity という基本クラスで DialogFragment を使用してダイアログを作成しています。

私が持っている質問は、DialogFragment のボタンの OnClickListener メソッドの OnClick メソッドから MyActivity クラスの関数を呼び出すことに関するものです。

それは働いています。理由を理解したいだけです。

関数 (MyActivity.someFunction()) を直接参照しようとすると、「タイプ MyActivity から非静的メソッド someFunction() への静的参照を作成できません」というメッセージが表示されます。静的と非静的を説明する良い方法があり、この特定の参照が静的である理由はありますか? DialogFragment が static として宣言されているためだと思います。サブクラス/メソッドを静的と非静的に宣言する目的は何ですか。つまり、メソッドがインスタンス化されたオブジェクトではなく、クラスに属していることが問題になるのはなぜでしょうか?

また、この例では、キャスティングが静的参照を回避する理由と方法を教えてください。

ありがとう!

public static class myDialogFragment extends DialogFragment {
    static myDialogFragment newInstance(int whichDialog) {
        myDialogFragment f = new myDialogFragment();
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.invasive_edit_dialog, container, true);

        Button btn_apply_coords = (Button)v.findViewById(R.id.btn_get_coord);
        btn_apply_coords.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                    // This does not work ("Cannot make a static reference to the non-static method someFunction() from the type MyActivity").
                MyActivity.someFunction();


                    // This does not work ("The method someFunction() is undefined for the type FragmentActivity"). Eclipse suggests casting (a few lines down).
                getActivity().someFunction();

                    // This works; casted version of code above.  What is this code doing?
                ((MyActivity) getActivity()).someFunction();

                    // this works also
                MyActivity thisActivity =  (MyActivity) getActivity();
                thisActivity.someFunction();
            }
        });

        return v;
    }
}

public void someFunction() {
    // do something
}
4

1 に答える 1

2
 // This does not work ("Cannot make a static reference to the non-static method someFunction() from the type MyActivity").
            MyActivity.someFunction();

そのクラスのオブジェクトからではなく、 class( ) からこのメソッドを呼び出そうとしたため、これは機能しませんでしたMyActivity(例: ( MyActivity activity))

 // This works; casted version of code above.  What is this code doing?
            ((MyActivity) getActivity()).someFunction();

getActivity()私が推測するように、メソッドは にキャストされたオブジェクトを返し、そのオブジェクトでMyActivity非静的メソッド fromMyActivityが呼び出されたため、これはうまくいきました

要約すると、呼び出すことができるオブジェクトがなければ、非静的メソッドを呼び出すことはできません。

于 2012-06-17T23:00:37.963 に答える