Android 片段中的 AlertDialog

Android's AlertDialog in fragment

我有一个使用选项卡 activity 的应用,有 3 个选项卡,每个选项卡都有一个单独的片段和布局。 Tab3 有一些用户配置文件设置,例如名称。名称显示在 cardview 中,所以我使该 cardview 可点击,然后单击它会打开一个带有编辑文本的 alertDialog 以输入名称。为了构建这个对话框,我找到了 2 种方法。

首先:-(这是 运行 一旦单击 cardview(在 clicklistener 上))并且它工作得很好,我没有问题但是它只是感觉不像是最佳实践

AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

                alert.setTitle("Enter your Username");

                LayoutInflater inflater = getActivity().getLayoutInflater();
                View view1 = inflater.inflate(R.layout.editname_layout, null);
                alert.setView(view1);
                final EditText input = view1.findViewById(R.id.editname);
                alert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                        textView.setText(input.getText().toString());
                    }
                });

                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // Canceled.
                    }
                });

                alert.show();

其次:- 是我构建了一个单独的 DialogFragment,它带有一个接口,用于将数据发送回片段,这感觉是一种最佳实践,但我遇到了很多问题,例如.. 当数据被发送回我的片段时,我不能对接收到的数据使用方法“textView.setText”,因为我在 onCreateView 方法之外接收它,因此 textView 总是 returns null。

public class Dialog extends AppCompatDialogFragment {
    
    private Context context;
    public DialogListener listener;

    public Dialog(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public android.app.Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View view = inflater.inflate(R.layout.name_layout, null);
            final EditText name = (EditText) view.findViewById(R.id.editname);
            builder.setView(view)
                    .setTitle("Username")
                    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    })
                    .setPositiveButton("Save", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String text = name.getText().toString();
                            listener.data(text);
                            Toast.makeText(getActivity(), "Saved", Toast.LENGTH_SHORT).show();
                        }
                    });
        
      
         return builder.create();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        try {
            Fragment fragment = new Tab3();
            listener = (DialogListener) fragment;
        }
        catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement d.l");
        }
    }



    public interface DialogListener {
        void data(String name);
    }
}

所以我的想法是我应该使用第一种方法,因为它更容易,而且更容易从中提取文本,但仍然不确定这是否是一个好的做法。

提前致谢!

这不是最佳实践的问题,而是您希望如何设计应用程序的问题。

  • 第一种解决方案:您可以直接与您的UI进行交互。例如:在 textView 中设置新值。但是如果你写的对话比较多的话,想想把逻辑泛化一下(方案二)。
  • 第二个解决方案:如果你只想要一个通用的 Dialog,你需要 use-case 因为它 = 多次调用对话框并且不要忘记:如果你实例化对话框 class 如果你想在 UI
  • 中更改它,你需要给他 textView

首选第二种解决方案:

  1. 您可以拥有自己的 自定义 UI 元素。
  2. 您可以访问 生命周期 更改(onResumeonCreate 等)。
  3. 即使方向改变了它也一直显示(第一个解决方案没有)。

为了将数据发送到上一个片段,您可以创建 listener 片段。

interface MyFragmentListener {
    fun onSendBackData(data: Any)
}
class MyFragment:Fragment {
    private var listener: MyFragmentListener? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = when {
            context is MyFragmentListener -> context
            parentFragment is MyFragmentListener -> parentFragment as MyFragmentListener
            else -> error("You should implement MyFragmentListener")

        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        button.setOnClickListener {
            listener?.onSendBackData("Data")
        }
    }
}
class Activity : Activity(), MyFragmentListener {

   override fun onSendBackData(data:Any) {
      textView.text = data.toString()
   }
}