【发布时间】: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