0

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

谢谢指教。

4

5 回答 5

1

就我而言,最简单的解决方案是有点“硬编程”,就像我在问题中提到的那样,我需要一种方法BaseFragment()来处理来自所有屏幕的所有后按动作,这意味着所有扩展 this 的片段BaseFragment()

@Sharp Edge 解决方案可能会被接受,但是如果我可以只添加一个方法并且所有扩展的简单活动都不关心,为什么要在每个SimpleActivity()扩展中处理它。BaseActivity()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;
        }
    });
}
于 2015-08-27T08:01:06.357 回答
1

@Choletski:

onBackPressed()

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

How to implement onBackPressed() in Android Fragments?

于 2015-08-26T12:27:13.630 回答
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以让系统接管(即退出您的活动)。

这是 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;
    }
}
于 2015-08-26T12:28:46.790 回答
0

您必须为此创建一个自定义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 的那些。

于 2015-08-26T12:01:36.103 回答
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;
        }
    });
于 2015-08-26T12:00:23.423 回答