我有一个具有许多活动的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解决方案是混乱的,不是预期的…我可以更容易地处理使用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;
}
});
}
这就是我如何处理它,当我有一个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;
}
}