在扩展对话框片段的片段中应用 onBackPressed 时
When apply onBackPressed in Fragment which extends dialog Fragment
我想在扩展 DialogFragment
的片段中实现 onBackPressed。但是当覆盖它时会给出一个错误 "method does not override its superclass".
如何实现?
See here for a chunk of the code.
See here for backpressed code
试试这个
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);
}
}
关注这个。通过使用 Abstract Class
.
在 Fragment
上实现 onBackPressed()
功能的绝佳示例
1) 创建摘要 Class -
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
在您的应用中使用片段时,各个 FragmentTransaction 对象可能表示应添加到返回堆栈的上下文更改。例如,如果您要通过交换片段在手机上实现 master/detail 流程,您应该确保在详细信息屏幕上按下返回按钮 returns 用户到主屏幕。为此,请在提交事务之前调用 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.
}
});
@Swati 根据您的评论,您想退出当前对话以及当前 activity。该对话框是显示在当前 activity 之上的另一层 window。 DialogFragment 只是一个 shell,它保存实际的对话框并管理设备旋转等状态。
对话框本身也消耗了按键事件,包括后压。所以DialogFragment上没有这种backpress方法。
我建议您在创建对话框后获取对话框 see here , override this method and let super class create the dialog then set dismiss listener to it. In the dismiss listener callback you can finish your activity and it will return to the previous activity. You can also use getDialog 方法应该是一样的。
嗨,也许我来不及找到正确的答案,但这对我有用
@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;
});
}
您的对话框片段键侦听器方法中有代码
dialog!!.setOnKeyListener { _ , keyCode, event ->
keyCode == KeyEvent.KEYCODE_BACK
}
这样即使在后退时按下点击对话框片段也不会关闭
但是你必须设置 dialog 属性 as
dialog?.setCancelable(false)
dialog?.setCanceledOnTouchOutside(false)
我想在扩展 DialogFragment
的片段中实现 onBackPressed。但是当覆盖它时会给出一个错误 "method does not override its superclass".
如何实现?
See here for a chunk of the code.
See here for backpressed code
试试这个
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);
}
}
关注这个。通过使用 Abstract Class
.
Fragment
上实现 onBackPressed()
功能的绝佳示例
1) 创建摘要 Class -
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
在您的应用中使用片段时,各个 FragmentTransaction 对象可能表示应添加到返回堆栈的上下文更改。例如,如果您要通过交换片段在手机上实现 master/detail 流程,您应该确保在详细信息屏幕上按下返回按钮 returns 用户到主屏幕。为此,请在提交事务之前调用 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.
}
});
@Swati 根据您的评论,您想退出当前对话以及当前 activity。该对话框是显示在当前 activity 之上的另一层 window。 DialogFragment 只是一个 shell,它保存实际的对话框并管理设备旋转等状态。
对话框本身也消耗了按键事件,包括后压。所以DialogFragment上没有这种backpress方法。
我建议您在创建对话框后获取对话框 see here , override this method and let super class create the dialog then set dismiss listener to it. In the dismiss listener callback you can finish your activity and it will return to the previous activity. You can also use getDialog 方法应该是一样的。
嗨,也许我来不及找到正确的答案,但这对我有用
@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;
});
}
您的对话框片段键侦听器方法中有代码
dialog!!.setOnKeyListener { _ , keyCode, event ->
keyCode == KeyEvent.KEYCODE_BACK
}
这样即使在后退时按下点击对话框片段也不会关闭 但是你必须设置 dialog 属性 as
dialog?.setCancelable(false)
dialog?.setCanceledOnTouchOutside(false)