【问题标题】:Android's AlertDialog in fragmentAndroid 的 AlertDialog 在片段中
【发布时间】:2021-01-31 18:02:13
【问题描述】:

我有一个使用选项卡式活动的应用程序,有 3 个选项卡,每个选项卡都有一个单独的片段和布局。 Tab3 有一些用户配置文件设置,例如名称。名称显示在卡片视图中,因此我使该卡片视图可点击,并且 onClick 它将打开一个带有编辑文本的警报对话框以输入名称。为了构建这个对话框,我找到了 2 种方法。

首先:-(这会在点击卡片视图后运行(在 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 总是返回 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);
    }
}

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

提前致谢!

【问题讨论】:

    标签: java android android-studio android-fragments android-alertdialog


    【解决方案1】:

    首选第二种解决方案:

    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()
       }
    }
    

    【讨论】:

      【解决方案2】:

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

      • 第一个解决方案:您可以直接与您的 UI 交互。例如:在textView 中设置新值。但是如果你写了很多对话,考虑将逻辑泛化(第二种解决方案)。
      • 第二个解决方案:如果你只想要一个通用的Dialog,你需要它的用例 = 多次调用对话框,不要忘记:如果你实例化 Dialog 类,你需要给他@987654323 @如果你想在 UI 中改变它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 2017-09-03
        • 2012-04-29
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多