通用句柄OnBackPressed()

时间:2015-08-26 11:42:01

标签: android android-fragments actionlistener onbackpressed

我有一个BaseActivity()有很多活动,BaseFragment()有很多碎片。每个活动包含2-3个片段,我需要制作一个通用方法来处理来自所有片段的每个onBackPressed(全部 - 意味着所有应用程序屏幕),但此方法应该在Base Fragment() (每个片段扩展它)。我认为我需要一种倾听者将OnBackPressed()BaseActivity()genericMethod() BaseFragment()绑在一起$stmt

感谢您的建议。

5 个答案:

答案 0 :(得分:1)

@Choletski:

onBackPressed()

当活动检测到用户按下后退键时,将调用它。默认实现只是完成当前活动,但您可以覆盖它以执行任何您想要的操作。同时覆盖默认的后退按钮操作,因为不建议更改Android默认用户体验。

Override the onBackPressed() 方法,并在此功能中执行操作。

@Override
    public void onBackPressed() {
        // Write your code here

        super.onBackPressed();
    }

How to implement onBackPressed() in Android Fragments?

答案 1 :(得分:1)

最简单的解决方案有点"硬编程"在我的情况下,就像我在我的问题中提到的,我需要一个来自BaseFragment()的方法来处理所有屏幕中的所有反压操作,这意味着扩展了此BaseFragment()的所有片段。

@Sharp Edge解决方案可能会被接受,但如果我可以在SimpleActivity()中添加单个方法以及扩展{{}}的所有简单活动,那么为什么要在BaseActivity()扩展BaseFragment()的每个BaseActivity()中处理它{1}}不会关心它。

@ escape-llc解决方案很困惑而不是预期的...我可以使用 EventBus Otto 更轻松地处理它并从onResume()发送每个片段到SimpleActivity()。因此,我将收到实际的开放片段,现在我将执行onBackPressed()时要执行的操作...

所以,就像我说的,我的解决方案是在BaseFragment()中使用一个简单的通用方法:

   public void doBackBtnPressedAction(View view) {
    view.setFocusableInTouchMode(true);
    view.requestFocus();

    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {

                    //logical part, in my case some server requests 

                    return true;
                }
            }
            return false;
        }
    });
}

答案 2 :(得分:0)

当我在片段中使用webview并且想要为webview处理onBackPressed时,这就是我处理它的方式吗?

public class Tab2 extends Fragment {
ProgressBar progress;
WebView x;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v =inflater.inflate(R.layout.tab_2,container,false);
    x = (WebView)v.findViewById(R.id.webView);
    x.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(event.getAction() == KeyEvent.ACTION_DOWN)
            {
                WebView web = (WebView)v;
                switch (keyCode)
                {
                    case KeyEvent.KEYCODE_BACK:
                        if(web.canGoBack())
                        {
                            web.goBack();
                            return  true;
                        }
                        break;
                }
            }
            return false;
        }
    });

答案 3 :(得分:0)

您必须为此创建一个自定义Activity类,并在onBackPressed()上覆盖它并在其中添加您的逻辑。然后确保使用片段的任何位置,您必须创建此CustomActivity的相关Activity子类。

因此,无论何时Fragment用户是onBackPressed(),都会调用该活动的super()并向其添加MyCustomActvity extends FragmentActivity{ @Override public void onBackPressed(){ // your logic here super.onBackPressed(); } } ..以便它将调用基类'方法和代码将在每个片段上运行。

示例:

onBackPressed()

现在您知道片段必须至少有1个基本活动,因此只需覆盖该活动的MyActivity extends MyCustomActivity{ // 3 fragments are called/replaced from this activity // other code @Override public void onBackPressed(){ super.onBackPressed(); // it will invoke base class method and your code } }

MyCustomActivity

只为使用片段的那些扩展@Override public void onEnteringPage(Wizard wizard) { ObservableList<ButtonType> list = getButtonTypes(); for (ButtonType type : list) { if (type.getButtonData().equals(ButtonBar.ButtonData.BACK_PREVIOUS)) { Node prev = lookupButton(type); prev.visibleProperty().setValue(Boolean.FALSE); } } }

答案 4 :(得分:0)

这是一种以一般方式处理它的好方法。我们现在在所有基于片段的应用程序中使用它。

首先为要实现的片段创建一个接口。这表示他们是否想要处理后退键。如果没有,请不要实现界面。

public interface IHandleBackPressed {
    boolean handleBackPressed(Activity ax);
}

这实际上是活动onBackPressed方法的代理。

接下来,使用此样板文件覆盖Activity.onBackPressed方法:

@Override
public void onBackPressed() {
    final Fragment fx = getFragmentManager().findFragmentById(R.id.content);
    if(fx != null) {
        if(fx instanceof IHandleBackPressed) {
            final IHandleBackPressed ihbp = (IHandleBackPressed)fx;
            if(ihbp.handleBackPressed(this)) {
                // we handled it
                return;
            }
        }
    }
    // onBackPressed unhandled by us
    super.onBackPressed();
}

这总是一样的。如果您有多个片段区域,只需重复每个片段区域的序列即可。如果您有其他逻辑,请在调用super.onBackPressed之前或之后将其集成,以让系统接管(即退出您的活动)。

以下是Fragment可以执行的操作的示例。此示例使用WebView,它希望&#34;使用&#34;用于管理WebView

的后栈的后退键
public class BrowseUrlFragment extends Fragment implements IHandleBackPressed {
    WebView wv;
    public boolean handleBackPressed(Activity ax) {
        if(wv != null && wv.canGoBack()) {
            wv.postDelayed(goback, 150);
            return true;
        }
        return false;
    }
}