android 防止片段在按下时留下
android prevent fragment leave on back pressed
我在 FragmentActivity
里面有一个 ViewPager
。对于每个页面,我都有一个 Fragment
和一个 EditText
.
如果 EditText
值已更改,我想阻止用户离开屏幕,显示警告 Dialog
询问 he/she 是否真的想离开屏幕。
为此,我需要在按下后 Button
时检查 EditText
值。
我只找到了如何使用容器 FragmentActivity
中的 onBackPressed()
方法。
问题是我不知道如何从父 FragmentActivity
.
访问 Fragment
里面的 EditText
只在Fragment
中做不行吗?我试过 onStop
和 onDetach
方法,但它们在离开 Fragment
后被调用,所以我无法停止它。
有什么想法吗?
您可以创建具有方法 onBackPressed 的接口(您的片段应实现此接口),然后在您的 activity 中覆盖方法 onBackPressed,然后通过标签或 ID 找到您的片段 -> 转换为此接口并调用这个方法。
所以您需要 BackPressed()
片段中的事件来解决您的问题,以检查 editext 的值是否已更改?
所以您已经创建了自己的 OnBackpressed()
界面。
创建界面OnBackPressedListener
public interface OnBackPressedListener {
public void doBack();
}
创建一个新的 class 名称 BaseBackPressedListener
public class BaseBackPressedListener implements OnBackPressedListener {
private final FragmentActivity activity;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
//activity.getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
在添加片段的顶部 Activity class BaseBackPressedListener
创建一个实例
protected OnBackPressedListener onBackPressedListener;
在你的top base activity中创建一个方法来设置新class上面新创建的实例
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
你将在你的 top base 中覆盖 onBackPressed()
方法 activity 像这样修改它
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
else
super.onBackPressed();
}
最后你在片段中添加了这个 onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Activity activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
//your other stuff here
return view;
}
现在你可以检查在你的顶部基地按下的后退activity天气编辑文本值改变我们不通过修改这个方法
@Override
public void doBack() {
if(!IsEditTextChanged)
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
//activity.getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
IsEditTextChanged 是全局变量,在 textchanged 上设置其值
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0)
IsEditTextChanged = true;
// your desired logic here?
}
});
Fragment BackPressed thread
您可以在 FragmentActivity 中创建一个布尔值,并使其随着 EditText 的更新而更新。通过这种方式,您可以检查字符串值而不是 EditText(实际上片段无法加载到寻呼机中)。
例如:
1) 创建接口以声明输入协议
public interface InputInterface {
void setEditTextNotEmpty(Boolean notEmpty);
}
2) 在你的 FragmentActivity 中实现这个接口
public class MainActivity implements InputInterface {
private Boolean editTextNotEmpty;
...
@Override
void setEditTextNotEmpty(Boolean changed){
editTextNotEmpty=changed;
}
@Override
public void onBackPressed() {
... your custom code....
}
3) 当 Fragment 像 post 中那样可视化时,您会以某种方式通知它:How to determine when Fragment becomes visible in ViewPager
当片段可视化时,您可以根据需要更新 activity 布尔值。
4) 在更新编辑文本时保持 MainActivity 更新:
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
if (getActivity instanceof InputInterface){
Boolean notEmpty = !TextUtils.isEmpty(s.toString);
((InputInterface)getActivity).setEditTextNotEmpty(notEmpty);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
希望对您有所帮助。
在您的 parent Activity
中试试这个:
@Override
public void onBackPressed() {
super.onBackPressed();
YourFragment fragment = (YourFragment) getSupportFragmentManager().getFragments().get(viewPager.getCurrentItem());
}
然后您可以访问您的 Fragment
,因此您可以在您的片段中添加一个参数 textHasChanged
(例如)并在文本更改时更新它。
我在 FragmentActivity
里面有一个 ViewPager
。对于每个页面,我都有一个 Fragment
和一个 EditText
.
如果 EditText
值已更改,我想阻止用户离开屏幕,显示警告 Dialog
询问 he/she 是否真的想离开屏幕。
为此,我需要在按下后 Button
时检查 EditText
值。
我只找到了如何使用容器 FragmentActivity
中的 onBackPressed()
方法。
问题是我不知道如何从父 FragmentActivity
.
Fragment
里面的 EditText
只在Fragment
中做不行吗?我试过 onStop
和 onDetach
方法,但它们在离开 Fragment
后被调用,所以我无法停止它。
有什么想法吗?
您可以创建具有方法 onBackPressed 的接口(您的片段应实现此接口),然后在您的 activity 中覆盖方法 onBackPressed,然后通过标签或 ID 找到您的片段 -> 转换为此接口并调用这个方法。
所以您需要 BackPressed()
片段中的事件来解决您的问题,以检查 editext 的值是否已更改?
所以您已经创建了自己的 OnBackpressed()
界面。
创建界面OnBackPressedListener
public interface OnBackPressedListener {
public void doBack();
}
创建一个新的 class 名称 BaseBackPressedListener
public class BaseBackPressedListener implements OnBackPressedListener {
private final FragmentActivity activity;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
//activity.getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
在添加片段的顶部 Activity class BaseBackPressedListener
创建一个实例
protected OnBackPressedListener onBackPressedListener;
在你的top base activity中创建一个方法来设置新class上面新创建的实例
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
你将在你的 top base 中覆盖 onBackPressed()
方法 activity 像这样修改它
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
else
super.onBackPressed();
}
最后你在片段中添加了这个 onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Activity activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
//your other stuff here
return view;
}
现在你可以检查在你的顶部基地按下的后退activity天气编辑文本值改变我们不通过修改这个方法
@Override
public void doBack() {
if(!IsEditTextChanged)
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
//activity.getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
IsEditTextChanged 是全局变量,在 textchanged 上设置其值
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0)
IsEditTextChanged = true;
// your desired logic here?
}
});
Fragment BackPressed thread
您可以在 FragmentActivity 中创建一个布尔值,并使其随着 EditText 的更新而更新。通过这种方式,您可以检查字符串值而不是 EditText(实际上片段无法加载到寻呼机中)。
例如:
1) 创建接口以声明输入协议
public interface InputInterface {
void setEditTextNotEmpty(Boolean notEmpty);
}
2) 在你的 FragmentActivity 中实现这个接口
public class MainActivity implements InputInterface {
private Boolean editTextNotEmpty;
...
@Override
void setEditTextNotEmpty(Boolean changed){
editTextNotEmpty=changed;
}
@Override
public void onBackPressed() {
... your custom code....
}
3) 当 Fragment 像 post 中那样可视化时,您会以某种方式通知它:How to determine when Fragment becomes visible in ViewPager
当片段可视化时,您可以根据需要更新 activity 布尔值。
4) 在更新编辑文本时保持 MainActivity 更新:
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
if (getActivity instanceof InputInterface){
Boolean notEmpty = !TextUtils.isEmpty(s.toString);
((InputInterface)getActivity).setEditTextNotEmpty(notEmpty);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
希望对您有所帮助。
在您的 parent Activity
中试试这个:
@Override
public void onBackPressed() {
super.onBackPressed();
YourFragment fragment = (YourFragment) getSupportFragmentManager().getFragments().get(viewPager.getCurrentItem());
}
然后您可以访问您的 Fragment
,因此您可以在您的片段中添加一个参数 textHasChanged
(例如)并在文本更改时更新它。