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