通用句柄 OnBackPressed()

Generic handle OnBackPressed()

我有一个有很多活动的 BaseActivity() 和一个有很多片段的 BaseFragment()。每个 activity 包含 2-3 个片段,我需要创建一个通用方法来处理所有片段中的每个 onBackPressed(全部 - 表示所有应用程序屏幕),但此方法 应该在 Base Fragment() (每个片段都扩展它)。我想我需要一种监听器来将 OnBackPressed()BaseActivity() 绑定到 genericMethod()BaseFragment()

谢谢指教。

这就是我在片段中有一个 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;
        }
    });

您必须为此自定义 Activity class.. 并在 onBackPressed() 上覆盖它并在它们中添加您的逻辑。然后确保在使用 Fragments 的任何地方,都必须使此 CustomActivity..

的关联 Activity sub class

因此,无论 Fragment 用户在哪个 Fragment 上,都会调用 Activity 中的 onBackPressed() 并向其添加 super().. 这样它就会调用基础 class 的方法和您的代码将在每个片段上 运行。

示例:

MyCustomActvity extends FragmentActivity{
  @Override
  public void onBackPressed(){

   // your logic here
   super.onBackPressed();
   }


}

现在您知道 Fragments 必须至少有 1 个 Base Activity,所以只需覆盖 Activity 的 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 给那些使用 Fragments 的。

@Choletski:

onBackPressed()

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

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

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

        super.onBackPressed();
    }

How to implement onBackPressed() in Android Fragments?

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

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

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

这本质上是 activity 的 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 之前或之后集成它,让系统接管(即退出您的 activity)。

这是 Fragment 可以做什么的示例。此示例使用 WebView 并且它想要 "use" 返回键来管理 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;
    }
}

最简单的解决方案就我而言有点 "hard programmed",就像我在问题中提到的那样,我需要一个来自 BaseFragment() 的方法来处理来自所有屏幕的所有后按操作,这意味着所有扩展此 BaseFragment().

的片段

@Sharp Edge 解决方案可能会被接受,但为什么要在扩展 BaseActivity() 的每个 SimpleActivity() 中处理它,如果我可以在 BaseFragment() 中添加一个方法和所有简单的活动extends 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;
        }
    });
}