在Fragment中应用onBackPressed时会扩展对话框Fragment

时间:2017-04-20 12:12:28

标签: android fragment dialogfragment onbackpressed

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

See here for backpressed code

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

试试这个

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

答案 2 :(得分:1)

在应用程序中使用片段时,单个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.
            }
        });

答案 3 :(得分:1)

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

对话框本身也消耗了keyevent include backpress。所以在DialogFragment上没有这样的反印方法。

我建议你在创建对话框see here后获取对话框,重写此方法并让超类创建对话框然后设置dismiss listener to it。在dismiss listener回调中,您可以完成您的活动,它将返回上一个活动。您也可以使用getDialog方法,该方法应该可以正常工作。

答案 4 :(得分:0)

嗨,也许我来不及正确的弓箭了,但这对我有用

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

答案 5 :(得分:0)

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

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

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

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