2014-06-21 42 views
2

我试图在后退按钮被触摸时在我的片段中执行一些代码。我在我的活动中创建一个接口并在我的片段中实现它。但是当我回头时,它会崩溃。我做过的事情有什么问题?如何通知一个活动,后退按钮已被按下片段?

import android.support.v7.app.ActionBarActivity; 

public class myActionBarActivity extends ActionBarActivity{ 
    public OnBackPressedListener onBackPressedListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.actionbaractivity_layout); //loads fragment 

    @Override 
    public void onBackPressed(){   
     onBackPressedListener.onActivityBackPressed(); 

    } 

    public interface OnBackPressedListener{ 
     public void onActivityBackPressed();  
    } 

} 

片段:

import android.support.v4.app.Fragment; 
public class myFragment extends Fragment implements myActionBarActivity.OnBackPressedListener{ 
    ... 
    ... 

    @Override 
    public void onActivityBackPressed() { 
     Toast.makeText(getActivity(), "Back pressed", Toast.LENGTH_SHORT).show(); 

    } 

} 

logcat的:

06-21 18:04:30.351: E/InputEventSender(6530): Exception dispatching finished signal. 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): Exception in MessageQueue callback: handleReceiveCallback 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): java.lang.NullPointerException 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at mypackage.myActionBarActivity.onBackPressed(myActionBarActivity.java:23) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.app.Activity.onKeyUp(Activity.java:2222) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.KeyEvent.dispatch(KeyEvent.java:2917) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.app.Activity.dispatchKeyEvent(Activity.java:2456) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchKeyEvent(ActionBarActivityDelegateICS.java:258) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2211) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4583) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4559) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4268) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4191) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4325) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4191) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4301) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4451) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2223) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1895) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1886) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2200) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.os.MessageQueue.nativePollOnce(Native Method) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.os.MessageQueue.next(MessageQueue.java:132) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.os.Looper.loop(Looper.java:124) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at android.app.ActivityThread.main(ActivityThread.java:5493) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at java.lang.reflect.Method.invokeNative(Native Method) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at java.lang.reflect.Method.invoke(Method.java:525) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 
06-21 18:04:30.351: E/MessageQueue-JNI(6530): at dalvik.system.NativeStart.main(Native Method) 

做到这一点已经在这里https://stackoverflow.com/a/19133522/2105986解释正确的方法。但我真的不明白。我正在寻找一种更简单的方式来使其工作。

+1

您必须设置您的侦听器,因为它当前始终为null。按照我在寻找的5 – WonderCsabo

+0

@WonderCsabo的指南中的步骤。谢谢 – faizal

+0

@Narayansoni谢谢,但我宁愿不强迫我的碎片来实现接口。因此给片段选择“设置”监听器是一个更灵活的选择。 – faizal

回答

1

基于由@WonderCsabo评论,

一下添加到活动:

public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener){ 
     this.onBackPressedListener = onBackPressedListener; 
    } 

在片段这onResume()地址:

((myActionBarActivity)getActivity()).setOnBackPressedListener(this); 
3

你的应用程序崩溃,因为你的监听对象( onBackPressListener)为空。

您的代码中某处需要将实现OnBackPressListener接口的Fragment设置为Listener。

例如,片段:

public class MyFragment extends Fragment implements OnBackPressListener { 
    //... 
} 

的活动:

public class MyActivity extends Activity { 

    private OnBackPressListener mListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     // assuming the fragment is defined in xml and has the id "myfrag" 
     setContentView(R.layout.actionbaractivity_layout); 

     MyFragment f = (MyFragment) getFragmentManager().findFragmentById(R.id.myfrag); 
     mListener = f; 
    } 

    @Override 
    public void onBackPressed(){   
     mListener.onActivityBackPressed(); 
    } 
} 

当然,在这种情况下,监听器是一种无用的,因为你可以简单地本身存储的片段作为成员。或者,您可以为侦听器提供setter方法,以便可以从任何地方进行设置。

相关问题