【问题标题】:When apply onBackPressed in Fragment which extends dialog Fragment当在扩展对话框片段的片段中应用 onBackPressed
【发布时间】:2017-04-20 12:12:28
【问题描述】:

我想在扩展 DialogFragment 的片段中实现 onBackPressed。但是在覆盖它时会出现“方法没有覆盖其超类”的错误。
如何实现?
See here for a chunk of the code.

See here for backpressed code

【问题讨论】:

  • 请专门发布源代码的 onBackPressed 部分。
  • 请分享您的代码并写下详细信息。
  • 添加了代码。请检查它并帮助我。
  • @Swati 你想在单击某些特定视图时实现 backPressed 功能吗?点击后要执行什么样的操作?
  • 我希望当我按下后退按钮时它会以纵向模式进入上一个活动。

标签: android fragment dialogfragment onbackpressed


【解决方案1】:

按照这个。使用Abstract ClassFragment 上实现onBackPressed() 功能的绝佳示例。

1) 创建一个抽象类 -

import android.app.Fragment;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;

public abstract class BackableFragment extends Fragment implements View.OnKeyListener {

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.setFocusableInTouchMode(true);
        view.requestFocus();
        view.setOnKeyListener(this);
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                onBackButtonPressed();
                return true;
            }
        }

        return false;
    }

    public abstract void onBackButtonPressed();
}

2) 将Abstract Class 实现到您的Fragment -

public class FragmentChannels extends BackableFragment {

    ...

    @Override
    public void onBackButtonPressed() {
        if (doTheThingRequiringBackButtonOverride) {
            // do the thing
        } else {
            getActivity().onBackPressed();
        }
    }

    ...
}

就是这样。 Reference

【讨论】:

  • 这会帮助你@swati
  • 这并不能回答他的问题。他想要 DialogFragment。
【解决方案2】:

@Swati 根据您的评论,您希望退出当前对话框以及当前活动。该对话框是显示在您当前活动之上的另一个级别的窗口。 DialogFragment 只是一个外壳,它保存实际的对话框并管理设备旋转等状态。

对话框本身也使用了包含 backpress 的 keyevent。所以DialogFragment上没有这样的backpress方法。

我建议您在创建对话框后获取对话框 see here ,覆盖此方法并让超类创建对话框,然后为其设置关闭侦听器。在驳回侦听器回调中,您可以完成您的活动,它将返回到上一个活动。您也可以使用getDialog 方法,它应该可以工作。

【讨论】:

  • 非常感谢...是的,你是对的。请为我提供代码。提前致谢。 @vsatkh
  • @Swati,对不起,我在工作,所以直到现在我才能回复你。请通过以下链接gist.github.com/cmidt-veasna/bab5dc37b8436d9d012f4fd394d02b84 访问我在 github 上的要点。我在上面的答案中建议的原始方法不起作用,因为 DialogFragment 会以某种方式覆盖回调,因为它需要在对话框消失时清理状态。
  • @Swati,也关闭并不意味着回压事件,它在对话框被关闭时发生。没错,关闭对话框会导致执行关闭回调。所以请注意这一点。
  • 是的,你是对的,那么我如何在你的代码上使用 backpress 事件?应用关闭事件时不显示图像。 @vsatkh
【解决方案3】:

试试这个

private boolean exit = false;
  /* your full actvivty */


@Override
 public void onBackPressed() {
  if (exit) {
            super.onBackPressed();
            return;
        } else {
            Toast.makeText(this, "Press Back again to Exit.", Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 2000);
        }
    }

【讨论】:

  • 谢谢,但我不想再次实现按退出功能。
  • 实际上你需要覆盖 oncliklistner 中的后台活动吗?
  • 我希望当我按下后退按钮时,它会以纵向模式进入上一个活动。
【解决方案4】:

在您的应用中使用 Fragment 时,单个 FragmentTransaction 对象可能表示应添加到后台堆栈的上下文更改。例如,如果您通过交换片段在手机上实现主/从流程,则应确保在详细信息屏幕上按“后退”按钮会将用户返回到主屏幕。为此,请在提交事务之前调用 addToBackStack():

// Works with either the framework FragmentManager or the
// support package FragmentManager (getSupportFragmentManager).
getSupportFragmentManager().beginTransaction()
                           .add(detailFragment, "detail")
                           // Add this transaction to the back stack
                           .addToBackStack()
                           .commit();

如果您的应用程序更新其他用户界面元素以反映片段的当前状态,例如操作栏,请记住在提交事务时更新 UI。除了提交事务之外,您还应该在返回堆栈更改后更新您的用户界面。您可以通过设置 FragmentManager.OnBackStackChangedListener 来监听 FragmentTransaction 何时恢复:

getSupportFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

【讨论】:

  • 谢谢...但我不想在 imageView 上应用 onClickListener。简单地说,我想旋转一个图像,当按下返回按钮时,它只在纵向模式下返回到以前的活动。
【解决方案5】:

您好,也许我来不及找到正确的答案,但这对我有用

@Override
public void onResume() {
    super.onResume();


    if (getView() != null)
        getView().setFocusableInTouchMode(true);

    getView().requestFocus();
    getView().setOnKeyListener((v, keyCode, event) -> {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                //TODO: Put here your action or method 
                return true;
            }
        }
        return false;
    });
}

【讨论】:

    【解决方案6】:

    对话框片段键侦听器方法中有代码

      dialog!!.setOnKeyListener { _ , keyCode, event ->
            keyCode == KeyEvent.KEYCODE_BACK
        }
    

    这样,即使在后按单击对话框片段也不会关闭 但是您必须将对话框属性设置为

     dialog?.setCancelable(false)
        dialog?.setCanceledOnTouchOutside(false)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多