我有一个BaseActivity()
有很多活动和一个BaseFragment()
有很多片段。每个活动包含 2-3 个片段,我需要创建一个通用方法来处理所有片段中的每个 onBackPressed(全部 - 表示所有应用程序屏幕),但这个方法应该在Base Fragment()
(每个片段都扩展它)。我想我需要一种听众来连接OnBackPressed()
fromBaseActivity()
到genericMethod()
fromBaseFragment()
谢谢指教。
我有一个BaseActivity()
有很多活动和一个BaseFragment()
有很多片段。每个活动包含 2-3 个片段,我需要创建一个通用方法来处理所有片段中的每个 onBackPressed(全部 - 表示所有应用程序屏幕),但这个方法应该在Base Fragment()
(每个片段都扩展它)。我想我需要一种听众来连接OnBackPressed()
fromBaseActivity()
到genericMethod()
fromBaseFragment()
谢谢指教。
就我而言,最简单的解决方案是有点“硬编程”,就像我在问题中提到的那样,我需要一种方法BaseFragment()
来处理来自所有屏幕的所有后按动作,这意味着所有扩展 this 的片段BaseFragment()
。
@Sharp Edge 解决方案可能会被接受,但是如果我可以只添加一个方法并且所有扩展的简单活动都不关心,为什么要在每个SimpleActivity()
扩展中处理它。BaseActivity()
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;
}
});
}
@Choletski:
It will be called when the activity has detected the user's press of the back key. The default implementation simply finishes the current activity, but you can override this to do whatever you want.while overriding the default back button action as it is not suggested to change the android default user experience.
Override the onBackPressed()
method and take the action inside this function.
@Override
public void onBackPressed() {
// Write your code here
super.onBackPressed();
}
这是以一般方式处理它的好方法。我们现在在所有基于片段的应用程序中使用它。
首先为要实现的片段创建一个接口。这表示他们是否想要处理后退键。如果不是,请不要实现该接口。
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
以让系统接管(即退出您的活动)。
这是 aFragment
可以做什么的示例。此示例使用 aWebView
并且它想“使用”后退键来管理 的后退堆栈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;
}
}
您必须为此创建一个自定义Activity
类..并覆盖它onBackPressed()
并在其中添加您的逻辑。然后确保无论在哪里使用 Fragments,都必须创建Activity
此 CustomActivity 的关联子类。
因此,无论何时无论是哪个Fragment
用户,onBackPressed()
都会调用该 Activity 并将其添加super()
到其中。这样它将调用基类的方法,并且您的代码将在每个片段上运行。
例子:
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 的那些。
当我在片段中有一个 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;
}
});