android 防止片段在按下时留下

android prevent fragment leave on back pressed

我在 FragmentActivity 里面有一个 ViewPager。对于每个页面,我都有一个 Fragment 和一个 EditText.

如果 EditText 值已更改,我想阻止用户离开屏幕,显示警告 Dialog 询问 he/she 是否真的想离开屏幕。

为此,我需要在按下后 Button 时检查 EditText 值。

我只找到了如何使用容器 FragmentActivity 中的 onBackPressed() 方法。

问题是我不知道如何从父 FragmentActivity.

访问 Fragment 里面的 EditText

只在Fragment中做不行吗?我试过 onStoponDetach 方法,但它们在离开 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(例如)并在文本更改时更新它。