0

我已经研究了几天,还没有找到可行的解决方案。有很多可用的信息,但由于我对 Android 缺乏经验,我无法获得任何建议。

我有一个 Activity,上面有 3 个 Fragment 堆栈,所有这些都使用 FragmentManager Transactions 呈现并添加到后台堆栈。当第三个 Fragment 处于活动状态时,我需要拦截 onBackPressed() 方法并在 Fragment 被销毁之前执行一些额外的操作。

我尝试使用回调和接口在活动中捕获 onBackPressed() 并将其发送到第三个片段,但没有成功。

对于 Activity 的 onBackPressed() 方法,在堆栈中深入观察 Fragment 的正确方法是什么。

如果不清楚,请告诉我。

谢谢您的帮助。

4

3 回答 3

0

未编译和测试,但这列出了基本方法:

public interface BackButonListener {
    boolean OnBackButtonPressed();
} 

public interface BackButtonWatchable {
     void addBackButtonListener(BackButtonListener listener);
     void removeBackButtonListener(BackButtonListener listener);
}

public class MyActivity extends Activity implements BackButtonWatchable {
...
    private static ArrayList<BackButtonListener> backButtonListeners
        = new ArrayList<BackButtonListener>();
    @Override 
    public void addBackButtonListener(BackButtonListener listener) {
          backButtonListeners.add(listener);
    }
    @Override
    public void removeBackButtonListener(BackButtonListener listener) {
          backButtonListeners.remove(listener);
    }
...
    @Override 
    public void onBackButtonPressed() 
    {
        boolean supressBackButton = false;
        for (BackButtonListener listener: backButtonListeners)
        {
             if (!listener.OnBackButtonPressed()) {
                  suppressBackButton = true;
             }
        }
        if (!suppressBackButton) {
            super.onBackButtonPressed();
        }
    }
}


public class MyFragment extends Fragment implements BackButtonListerer {
     @Override 
     public void onResume()
     {
          ((BackButtonWatchable)getActivity()).addBackButtonListener(this);
     }
     @Override 
     public void onPause()     {
          ((BackButtonWatchable)getActivity()).removeBackButtonListener(this);
     }
}
于 2015-07-03T22:15:34.103 回答
0

克里特界面

public interface OnBackPressedListener {
   void onBackPressed();
}

并在活动中创建字段

private OnBackPressedListener mListener;

你的 onBackPressed() 应该看起来像

if (mListener != null) {
   mListener.onBackPressed();
} else { /* do your acitivty usual stuff */ }

创建片段时,您在活动中将此片段注册为 mListener,并且不要在 onDestroy 中将其设置为 null。

于 2015-07-03T22:15:34.830 回答
0

这是回答我问题的帖子。对于一个 Android 新手来说,这告诉我一切都需要去哪里。

https://stackoverflow.com/a/30865486/2640458

需要从其活动中查看 onBackPress() 方法的片段:

public class RatingFragment extends Fragment implements ContentActivity.OnBackPressedListener  {

@Override
public void doBack() {
    getFragmentManager().popBackStack();
}

上面Fragment中对监听器的非常重要的订阅:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_rating, container, false);

    ((ContentActivity)getActivity()).setOnBackPressedListener(this);
}

需要向上述Fragment发送onBackPress()方法的Activity:

public class ContentActivity extends Activity {

protected OnBackPressedListener onBackPressedListener;

public interface OnBackPressedListener {
    void doBack();
}

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

@Override
public void onBackPressed() {
    if (onBackPressedListener != null)
        onBackPressedListener.doBack();
    else
        super.onBackPressed();
}

@Override
protected void onDestroy() {
    onBackPressedListener = null;
    super.onDestroy();
}
}
于 2015-07-04T00:50:01.077 回答