Android的AlertDialog片段

问题描述

我有一个使用选项卡式活动的应用程序,其中包含3个选项卡,每个选项卡具有单独的片段和布局。 Tab3具有一些用户配置文件设置,例如名称名称显示在cardview内,因此我使cardview可以单击,然后onClick它将打开一个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",int whichButton) {
                        // Canceled.
                    }
                });

                alert.show();

第二个:-是,我构建了一个单独的DialogFragment,其接口将数据发送回碎片,这似乎是一种最佳实践,但是我遇到了很多问题,例如..何时数据发送回我的片段,在接收到的数据上无法使用方法“ textView.setText”,因为我是在onCreateView方法之外接收到的,因此textView始终返回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",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,则需要用例=多次调用对话框,不要忘记:如果您实例化Dialog类,则需要给他textView,如果要在用户界面中进行更改
,

首选第二个解决方案:

  1. 您可以拥有自定义用户界面元素。
  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()
   }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...