0

MyFragmentActivity.java では、onKeyDown メソッドを使用してユーザーが音量を上げるボタンを押したかどうかを検出し、そのキーを MyFragment クラスの他のメソッドに渡します。私はNPEを取得します。何が欠けていますか?

MyFragment.java コード:

    public class MyFragment  extends SherlockFragment implements OnTouchListener{

public MyView myView= null;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
            {       

                myView = new MyView(getActivity());
                myView.setOnTouchListener(this);    
                return myView;      
            }



    public void myOnKeyDown(int key_code){    


    if(key_code == KeyEvent.KEYCODE_VOLUME_UP){

    myView.postInvalidate();    //myView is null

                }

        }

MyFragmentActivity.java コード:

public class MyFragmentActivity extends SherlockFragmentActivity{

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {


            ((MyFragment) mTabsAdapter.getItem(0)).myOnKeyDown(keyCode);

            if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){
                return true;
            }

        return super.onKeyDown(keyCode, event);
    }


}

問題は、MyFragment クラスの外部で myView.postInvalidate() を呼び出すときです。MyFragment から直接呼び出しても問題はありません。

ログキャット:

07-28 21:48:34.222: E/AndroidRuntime(579): FATAL EXCEPTION: main
07-28 21:48:34.222: E/AndroidRuntime(579): java.lang.NullPointerException
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.My.App.MyFragment.myOnKeyDown(MyFragment.java:398)
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.My.App.MyFragmentActivity.onKeyDown(MyFragmentActivity.java:173)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.view.KeyEvent.dispatch(KeyEvent.java:1037)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.app.Activity.dispatchKeyEvent(Activity.java:2068)
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.actionbarsherlock.app.SherlockFragmentActivity.dispatchKeyEvent(SherlockFragmentActivity.java:122)
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.os.Looper.loop(Looper.java:123)
07-28 21:48:34.222: E/AndroidRuntime(579):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-28 21:48:34.222: E/AndroidRuntime(579):  at java.lang.reflect.Method.invokeNative(Native Method)
07-28 21:48:34.222: E/AndroidRuntime(579):  at java.lang.reflect.Method.invoke(Method.java:521)
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-28 21:48:34.222: E/AndroidRuntime(579):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-28 21:48:34.222: E/AndroidRuntime(579):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

Fragment のonCreateViewメソッドは、この Fragment が可視になったときにのみ呼び出されます。((MyFragment) mTabsAdapter.getItem(0)).myOnKeyDown(keyCode);したがって、フラグメントが初期化される前に呼び出すと思います 。いずれにせよ、このイベントがすでに発生しているが、フラグメントがまだ初期化されていない状態が存在する可能性があります。したがってmyView、null 値を確認する必要があります。

于 2013-07-29T02:41:58.327 に答える