2013-07-29 4 views
0

В 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) 
+0

Всегда ... _always_ отправляйте лог-кошку всякий раз, когда у вас есть ошибка. _Всегда_. Даже если мы сможем догадаться из кода, я не трачу время на то, что может быть ясно, как вода, глядя на журналы. – davidcesarino

+0

Похоже, вы вызываете 'myView.postInvalidate()' перед его инициализацией. Добавьте несколько журналов, чтобы показать, когда инициализируется 'myView'. – andy256

+0

Инициализируется при создании MyFragment, вызывая myView.postInvalidate(); непосредственно из этого класса хорошо работает, но мне нужно назвать его в классе MyFragmentActivity. – user1612938

ответ

0

фрагмента onCreateView звонит только тогда, когда этот фрагмент становится видимым. Поэтому я думаю, что вы вызываете ((MyFragment) mTabsAdapter.getItem(0)).myOnKeyDown(keyCode); до того, как фрагмент инициализируется. В любом случае может быть состояние, когда это событие произошло, но фрагмент еще не инициализирован. Поэтому для нулевого значения вы должны проверить myView.

+0

Я вызываю ((MyFragment) mTabsAdapter.getItem (0)). MyOnKeyDown (keyCode); после инициализации onCreateView. Теперь у меня есть 3 класса: class1 -> class2 -> classView. Когда я обновляю классView из класса2, у меня нет какой-либо проблемы, но когда я вызываю обновление из класса 1, я получаю нулевой вид. – user1612938

Смежные вопросы