我在FragmentActivity
里有一个ViewPager
。对于每一页,我都有一个带有EditText
的Fragment
.
我想阻止用户在EditText
值更改时离开屏幕,在询问他/她是否真的要离开屏幕Dialog
显示警告。
为此,我需要在按下后Button
时检查EditText
值。
我只找到了如何做到这一点,但在容器中使用onBackPressed()
方法FragmentActivity
.
问题是我不知道如何从父FragmentActivity
访问Fragment
内的EditText
。
难道不能只在Fragment
里做吗?我已经尝试了该方法onStop
和onDetach
但是它们在离开Fragment
后被调用,所以我无法阻止它。
有什么想法吗?
在你的parent Activity
试试这个:
@Override
public void onBackPressed() {
super.onBackPressed();
YourFragment fragment = (YourFragment) getSupportFragmentManager().getFragments().get(viewPager.getCurrentItem());
}
然后,您可以访问Fragment
,以便在片段textHasChanged
中添加参数(例如),并在文本更改时对其进行更新。
您可以创建具有方法onBackPressed的接口(您的片段应该实现此接口),然后在您的活动中覆盖方法onBackPress,然后通过标签或id -> --将片段转换为此接口并调用此方法。
所以你需要片段中的BackPressed()
事件来检查 editext 的值是否被更改?
因此,您已经创建了自己的OnBackpressed()
界面。
创建接口OnBackPressedListener
public interface OnBackPressedListener {
public void doBack();
}
创建新的类名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);
}
}
在添加片段的顶级基本活动中创建新创建的类BaseBackPressedListener
的实例
protected OnBackPressedListener onBackPressedListener;
在顶级基本活动中创建一个方法,以设置上面新创建的新类实例
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
您将在顶级基本活动中覆盖onBackPressed()
方法,像这样修改它
@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;
}
现在你可以检查在你的顶部基础活动天气编辑文本值改变我们的不是通过修改此方法
@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?
}
});
片段背压线程
您可以在 FragmentActivity 中创建一个布尔值,并在更新 EditText 时保持更新。通过这种方式,您可以检查字符串值而不是编辑文本(实际上无法在寻呼机中加载片段)。
例如:
1) 创建一个接口以声明输入协议
public interface InputInterface {
void setEditTextNotEmpty(Boolean notEmpty);
}
2) 在片段活动中实现此接口
public class MainActivity implements InputInterface {
private Boolean editTextNotEmpty;
...
@Override
void setEditTextNotEmpty(Boolean changed){
editTextNotEmpty=changed;
}
@Override
public void onBackPressed() {
... your custom code....
}
3)当片段可视化时,您以某种方式通知了该片段,如本文中所述:如何确定片段何时在ViewPager中可见
可视化片段后,如有必要,可以更新活动布尔值。
4) 在更新编辑文本时保持主活动更新:
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) {}
});
我希望它有所帮助。