android防止片段离开按下

时间:2016-06-17 09:15:02

标签: android android-fragments android-viewpager onbackpressed

ViewPager内有FragmentActivity。对于每个页面,我都有Fragment EditText

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

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

我只是在容器onBackPressed()中使用FragmentActivity方法找到了怎么做。

问题在于我不知道如何从父EditText访问Fragment内的FragmentActivity

是不是只能在Fragment中执行此操作?我尝试了onStoponDetach方法但是在离开Fragment后会调用它们,所以我无法阻止它。

有什么想法吗?

4 个答案:

答案 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?
   }
  });

Fragment BackPressed thread

答案 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) {}
   });

我希望它有所帮助。