我ViewPager
内有FragmentActivity
。对于每个页面,我都有Fragment
EditText
。
如果EditText
值已更改,我想阻止用户离开屏幕,显示警告Dialog
询问他/她是否真的要离开屏幕。
为此,我需要在按下后面EditText
时检查Button
值。
我只是在容器onBackPressed()
中使用FragmentActivity
方法找到了怎么做。
问题在于我不知道如何从父EditText
访问Fragment
内的FragmentActivity
。
是不是只能在Fragment
中执行此操作?我尝试了onStop
和onDetach
方法但是在离开Fragment
后会调用它们,所以我无法阻止它。
有什么想法吗?
答案 0 :(得分:1)
在parent Activity
:
@Override
public void onBackPressed() {
super.onBackPressed();
YourFragment fragment = (YourFragment) getSupportFragmentManager().getFragments().get(viewPager.getCurrentItem());
}
然后您就可以访问Fragment
,以便在片段textHasChanged
中添加参数(例如),并在文本更改时更新。
答案 1 :(得分:0)
您可以创建具有onBackPressed方法的接口(您的片段应该实现此接口),然后在您的活动中覆盖onBackPressed方法,然后按标签或ID找到您的片段 - >转换为此接口并调用此方法。
答案 2 :(得分:0)
所以你需要片段中的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);
}
}
在顶部基础Activity中创建新创建的类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;
}
现在你可以检查你的顶级基础活动中的背压天气editext值改变我们不是通过修改这个方法
@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?
}
});
答案 3 :(得分:0)
您可以在FragmentActivity中创建一个布尔值,并在更新EditText的情况下更新它。通过这种方式,您可以检查String值而不是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)在这篇文章中,你以某种方式通知片段:How to determine when Fragment becomes visible in ViewPager
当片段可视化时,如果需要,可以更新活动布尔值。
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) {}
});
我希望它有所帮助。