通用句柄 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 解决方案很混乱,而不是预期的解决方案......我可以使用 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;
}
});
}
我有一个有很多活动的 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 解决方案很混乱,而不是预期的解决方案......我可以使用 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;
}
});
}