通用句柄OnBackPressed()



我有一个具有许多活动的BaseActivity()和一个具有许多片段的BaseFragment()。每个活动包含2-3个片段,我需要做一个通用的方法来处理每个onBackPressed从所有片段(所有-意味着所有的应用程序屏幕),但这个方法应该在Base Fragment() (每个片段扩展它)。我想我将需要一种侦听器将OnBackPressed()BaseActivity()连接到genericMethod()BaseFragment()

谢谢你的建议

@Choletski:

onBackPressed ()

当活动检测到用户按下返回键时调用。默认实现只是完成当前的活动,但是您可以覆盖它来做任何您想做的事情。而重写默认的后退按钮动作,因为不建议改变android默认的用户体验。

Override the onBackPressed() 方法,并在此函数内执行操作。

@Override
    public void onBackPressed() {
        // Write your code here
        super.onBackPressed();
    }

如何实现onBackPressed()在Android碎片?

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

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

@escape-llc解决方案是混乱的,不是预期的…我可以更容易地处理使用EventBusOtto,并从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;
        }
    });
}

这就是我如何处理它,当我有一个webview片段,并想处理onBackPressed的webview?

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;
        }
    });

您必须为此创建一个自定义Activity类。并在onBackPressed()上覆盖它,并将你的逻辑添加到他们的。然后确保在使用Fragments的地方,你必须为这个CustomActivity创建相关的Activity子类。

所以无论在哪个Fragment用户上,该活动的onBackPressed()将被调用并添加super()。这样它将调用基类的方法,你的代码将在每个片段上运行。

的例子:

MyCustomActvity extends FragmentActivity{
  @Override
  public void onBackPressed(){
   // your logic here
   super.onBackPressed();
   }

}

现在你知道碎片必须至少有一个基础活动,所以只需覆盖该活动的onBackPressed()

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为那些使用片段。

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

首先为片段创建一个接口来实现。这表示它们是否想要处理返回键。如果没有,就不要实现这个接口。

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,它想"使用"返回键来管理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;
    }
}

相关内容

  • 没有找到相关文章

最新更新