繁体   English   中英

如何获取AlertDialog setPositiveButton从editText中提取文本并将其放置在listView中

[英]How to get AlertDialog setPositiveButton to pull text from editText and place in listView

我是应用开发的新手。 在此布局上,我有一个浮动的操作按钮,当按下时会打开AlertDialog。我试图做的是,当用户在AlertDialog中选择setPositiveButton时,它将把放置在EditText字段中的用户拖放到该页面的listView / RecyclerView中。 我下面有我的Java和自定义对话框xml代码。 我需要添加什么才能使其成为可能。

 public class WorkoutFragment extends Fragment { RecyclerView recyclerView; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.workout_layout, container, false); recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); setupRecyclerView(recyclerView); FloatingActionButton button = (FloatingActionButton) rootView.findViewById(R.id.fab2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout builder.setView(inflater.inflate(R.layout.dialog_fab, null)) // Add action buttons .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // Create the AlertDialog object and return it AlertDialog dialog = builder.create(); dialog.show(); } }); return rootView; } private void setupRecyclerView(RecyclerView recyclerView) { recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(getActivity(), VersionModel.data)); } public static class SimpleStringRecyclerViewAdapter extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> { private String[] mValues; private Context mContext; public static class ViewHolder extends RecyclerView.ViewHolder { public final View mView; public final TextView mTextView; public ViewHolder(View view) { super(view); mView = view; mTextView = (TextView) view.findViewById(android.R.id.text1); } } public String getValueAt(int position) { return mValues[position]; } public SimpleStringRecyclerViewAdapter(Context context, String[] items) { mContext = context; mValues = items; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { holder.mTextView.setText(mValues[position]); holder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Snackbar.make(v, getValueAt(position), Snackbar.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return mValues.length; } } } 

我需要对RecyclerAdapter进行更改吗?

 public class SimpleRecyclerAdapter extends RecyclerView.Adapter<SimpleRecyclerAdapter.VersionViewHolder> { List<String> versionModels; Context context; public SimpleRecyclerAdapter(Context context){ this.context = context; } public SimpleRecyclerAdapter(List<String> versionModels){ this.versionModels = versionModels; } @Override public VersionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.workout_layout, parent, false); VersionViewHolder viewHolder = new VersionViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(SimpleRecyclerAdapter.VersionViewHolder holder, int position) { holder.title.setText(versionModels.get(position)); } @Override public int getItemCount() { return versionModels == null ? 0 : versionModels.size(); } class VersionViewHolder extends RecyclerView.ViewHolder{ CardView cardItemLayout; TextView title; public VersionViewHolder(View itemView){ super(itemView); cardItemLayout = (CardView)itemView.findViewById(R.id.cardlist_item); title = (TextView)itemView.findViewById(R.id.listitem_name); } } } 

这就是我的RecyclerAdpter从现在开始的目标。 我想要的是从使用我的dialog_fab.xml文件的AlertDialog中的editText字段中拉出,但onClickListener是setPositiveButton。

 public class VersionModel { public static final String[] data = { "cupcake", "donut", "eclair", "froyo", "gingerbread", "honeycomb", "ice cream sandwich", "jelly bean", "kit kat", "Lollipop", "marshmallow" }; } 

这是我的dialog_fab.xml文件

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="64dp" android:scaleType="center" android:background="#F44336" android:text="Test Title" android:textSize="55sp" android:contentDescription="@string/app_name" /> <EditText android:id="@+id/workoutTitle" android:inputType="text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginBottom="4dp" android:hint="Name" /> </LinearLayout> 

您可以在此处实现两种交互:

  1. 当对话框打开并且用户按下肯定按钮时,如果edittext为空,则对话框关闭且不执行任何操作;如果edittext中包含文本,则对话框关闭并更新recyclerview。
  2. 打开对话框时,只要edittext为空,肯定按钮将显示为灰色(禁用)。 出现文本时,正按钮启用。 在启用该按钮时按肯定按钮将关闭对话框并更新recyclerview。

由于更新RecyclerView是此处的共同点,因此我将首先解决它。

由于所有这些都是在片段内部发生的,因此您无需传递侦听器。 只需触发片段类的onAddWorkout()方法即可。

public class WorkoutFragment extends Fragment {
    RecyclerView recyclerView;

    public View onCreateView(...) {
        ...
    }

    ...

    private void onAddWorkout(String workoutTitle) {
        SimpleStringRecyclerViewAdapter adapter = (SimpleStringRecyclerViewAdapter) recyclerView.getAdapter;

        // You should probably use an ArrayList so that addition and removal of items will not require creating another object
        int length = adapter.mValues.length;
        adapter.mValues = Arrays.copyOfRange(adapter.mValues, 0, length + 1);
        adapter.mValues[length] = workoutTitle;
        adapter.notifyItemInserted(length);
    }

    ...


}

接下来是两个案件是更容易的选择数1:

public class WorkoutFragment extends Fragment {
    RecyclerView recyclerView;


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.workout_layout, container, false);
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        setupRecyclerView(recyclerView);

        FloatingActionButton button = (FloatingActionButton) rootView.findViewById(R.id.fab2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                // Get the layout inflater
                LayoutInflater inflater = getActivity().getLayoutInflater();

                View v = inflater.inflate(R.layout.dialog_fab, null);
                EditText e = view.findViewById(R.id.workoutTitle);
                builder.setView(v)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                                if (!TextUtils.isEmpty(e.getText().toString())) {
                                    // This block is responsible for checking if edittext is empty and carrying out the action
                                    onAddWorkout(e.getText().toString());
                                }
                            }
                        })
                        .setNegativeButton("Cancel", ...);
                // Create the AlertDialog object and return it
                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
        return rootView;
    }

    ...

}

第二部分

public class WorkoutFragment extends Fragment {
    RecyclerView recyclerView;


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.workout_layout, container, false);
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        setupRecyclerView(recyclerView);

        FloatingActionButton button = (FloatingActionButton) rootView.findViewById(R.id.fab2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                // Get the layout inflater
                LayoutInflater inflater = getActivity().getLayoutInflater();

                View v = inflater.inflate(R.layout.dialog_fab, null);
                EditText e = view.findViewById(R.id.workoutTitle);
                builder.setView(v)
                        .setPositiveButton("Yes", ...) // You can set your normal listener here.
                        .setNegativeButton("Cancel", ...);
                // Create the AlertDialog object and return it
                AlertDialog dialog = builder.create();
                dialog.show();

                // !mportant - this should be called **after** dialog.show() or in a dialog OnShowListener
                // This is because the buttons arent truly attached till the dialog is shown;

                final Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);

                e.addTExtWatcher(new TextWatcher() {
                    ...

                    public void onTextChanged(CharSequence s, int start, int before, int count) {

                        positiveButton.setEnabled(s.length() > 0);
                    }                    

                    ...
                });
            }
        });
        return rootView;
    }

    ...

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM