我有一个BaseActivity()
有很多活动,BaseFragment()
有很多碎片。每个活动包含2-3个片段,我需要制作一个通用方法来处理来自所有片段的每个onBackPressed(全部 - 意味着所有应用程序屏幕),但此方法应该在Base Fragment()
(每个片段扩展它)。我认为我需要一种倾听者将OnBackPressed()
从BaseActivity()
与genericMethod()
BaseFragment()
绑在一起$stmt
感谢您的建议。
答案 0 :(得分:1)
@Choletski:
当活动检测到用户按下后退键时,将调用它。默认实现只是完成当前活动,但您可以覆盖它以执行任何您想要的操作。同时覆盖默认的后退按钮操作,因为不建议更改Android默认用户体验。
Override the onBackPressed()
方法,并在此功能中执行操作。
@Override
public void onBackPressed() {
// Write your code here
super.onBackPressed();
}
答案 1 :(得分:1)
最简单的解决方案有点"硬编程"在我的情况下,就像我在我的问题中提到的,我需要一个来自BaseFragment()
的方法来处理所有屏幕中的所有反压操作,这意味着扩展了此BaseFragment()
的所有片段。
@Sharp Edge解决方案可能会被接受,但如果我可以在SimpleActivity()
中添加单个方法以及扩展{{}}的所有简单活动,那么为什么要在BaseActivity()
扩展BaseFragment()
的每个BaseActivity()
中处理它{1}}不会关心它。
@ 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;
}
});
}
答案 2 :(得分: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;
}
});
答案 3 :(得分:0)
您必须为此创建一个自定义Activity
类,并在onBackPressed()
上覆盖它并在其中添加您的逻辑。然后确保使用片段的任何位置,您必须创建此CustomActivity的相关Activity
子类。
因此,无论何时Fragment
用户是onBackPressed()
,都会调用该活动的super()
并向其添加MyCustomActvity extends FragmentActivity{
@Override
public void onBackPressed(){
// your logic here
super.onBackPressed();
}
}
..以便它将调用基类'方法和代码将在每个片段上运行。
示例:
onBackPressed()
现在您知道片段必须至少有1个基本活动,因此只需覆盖该活动的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
只为使用片段的那些扩展@Override
public void onEnteringPage(Wizard wizard) {
ObservableList<ButtonType> list = getButtonTypes();
for (ButtonType type : list) {
if (type.getButtonData().equals(ButtonBar.ButtonData.BACK_PREVIOUS)) {
Node prev = lookupButton(type);
prev.visibleProperty().setValue(Boolean.FALSE);
}
}
}
。
答案 4 :(得分: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
之前或之后将其集成,以让系统接管(即退出您的活动)。
以下是Fragment
可以执行的操作的示例。此示例使用WebView
,它希望&#34;使用&#34;用于管理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;
}
}