В MyFragmentActivity.java Я использую метод onKeyDown, чтобы определить, нажимает ли пользователь кнопку увеличения громкости, а затем передаю ключ другому методу в классе MyFragment и здесь, когда я вызываю myView.postInvalidate(); Я получаю 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);
}
}
Проблема заключается в том, когда я называю myView.postInvalidate() вне класса MyFragment, у меня нет никаких проблем, призывающих его прямо из MyFragment.
LogCat: метод
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)
Всегда ... _always_ отправляйте лог-кошку всякий раз, когда у вас есть ошибка. _Всегда_. Даже если мы сможем догадаться из кода, я не трачу время на то, что может быть ясно, как вода, глядя на журналы. – davidcesarino
Похоже, вы вызываете 'myView.postInvalidate()' перед его инициализацией. Добавьте несколько журналов, чтобы показать, когда инициализируется 'myView'. – andy256
Инициализируется при создании MyFragment, вызывая myView.postInvalidate(); непосредственно из этого класса хорошо работает, но мне нужно назвать его в классе MyFragmentActivity. – user1612938