![](/img/trans.png)
[英]Unable to validate EditText under setPositiveButton of an AlertDialog
[英]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>
您可以在此处实现两种交互:
由于更新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.