【问题标题】:Multiple DialogFragment event callbacks - how do I tell which fragment to update?多个 DialogFragment 事件回调 - 我如何判断要更新哪个片段?
【发布时间】:2017-09-06 19:46:01
【问题描述】:

这是我的情况。我有一个片段,上面有两个按钮。当您点击任一按钮时,会出现一个DialogFragment,其中包含一个带有确定/取消按钮的EditText。两个按钮打开同一个DialogFragment,但输入到EditTexts的数据需要分开。

我最近开始实现 Android 文档 seen here 中的片段事件回调模式,但遇到了一个问题 - 我有两个按钮使用相同的事件回调,我不确定如何区分用户刚刚完成了哪一个使用。因此,以文档为例,我可以从同一屏幕上的两个按钮打开FragmentA,但需要根据我单击的按钮以不同方式处理结果。

在我的片段中:

public static class FragmentA extends DialogFragment {
  public interface OnEditNameListener {
    public void onPositiveButtonClicked(String newName);
  }
}

@Override
public void onAttach(Context context){
    super.onAttach(context);
    try {
        mListener = (OnEditNameListener ) context;
    }
    catch (ClassCastException e) {
        throw new ClassCastException(context.toString() + " must implement OnEditNameListener ");
    }
}

在我的 Activity 中,它实现了 OnEditNameListener:

button1.setOnClickListener(new OnClickListener(){
  @Override
  public void onClick(View view) {
    (new EditNameDialog.Builder())
      .setTitle(getContext().getString(R.string.title))
      .setValue(currentText)
      .show(mParentFragmentActivity.getSupportFragmentManager());
       }
    });

button2.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View view) {
    (new EditNameDialog.Builder())
      .setTitle(getContext().getString(R.string.title2))
      .setValue(currentText2)
      .setInputType(InputType.TYPE_CLASS_NUMBER)
      .show(mParentFragmentActivity.getSupportFragmentManager());
      }
  });

@Override
public void onPositiveButtonClicked(String newName) {
  ... //does stuff with the name. 
//Currently no way to determine whether this came from button1 or button2.
}

目前,两个回调都使用来自DialogFragment 的输入命中相同的 OnPositiveButtonClicked 方法,但我不知道如何确定这来自两个按钮中的哪一个。

【问题讨论】:

    标签: android android-fragments android-dialogfragment android-lifecycle


    【解决方案1】:

    首先,您必须向您的onPositiveButtonClicked(String name,int buttonId) 添加一个参数,然后根据按下的按钮向 FragmentA 传递一个参数,例如:

    FragmentA fragment=new FragmentA();
     Bundle args = new Bundle();
     args.putInt("buttonId", 1 or 2);
     fragment.setArguments(args);
    //open the fragment from the activity
    

    然后在您的 FragmentA onCreate 方法中尝试:

     int buttonId = getArguments().getInt("buttonId"); 
    

    最后当按下肯定按钮时调用:

    onPositiveButtonClicked(newName,buttonId)
    

    更新

    更好的解决方案是在 DialogFragment 中创建一个 setter 并使用匿名接口,例如:

    (new EditNameDialog.Builder())
          .setTitle(getContext().getString(R.string.title))
          .setValue(currentText).setOnEditNameListener(new EditNameListener{
             @Override
              onPositiveButtonClicked(String newName){
              //handle action
              }
    });
    

    并在您的 DialogFragment 中添加 setter:

    EditNameListener listener;
    public DialogFragment setOnEditNameListener(EditNameListener listener){
       this.listener=listener;
     return this;
    }
    

    【讨论】:

    • 与您最初的回复类似。在我的情况下,我无法使用您的更新 - 这就是我最初拥有的。我正在处理一些活动可能已被破坏但片段仍在屏幕上的边缘情况。只有低内存手机才会真正发生。您可以通过在设备上的开发者设置中打开“不保留活动”来测试它。打开附加到 Activity 的 DialogFragment,离开应用程序,返回到它,然后尝试关闭 dialogfragment。应该抛出一个空指针,因为监听器已经消失了。事件回调(OP 中的链接)处理这种情况。
    猜你喜欢
    • 2012-02-05
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多