Android 片段中的 AlertDialog
Android's AlertDialog in fragment
我有一个使用选项卡 activity 的应用,有 3 个选项卡,每个选项卡都有一个单独的片段和布局。 Tab3 有一些用户配置文件设置,例如名称。名称显示在 cardview 中,所以我使该 cardview 可点击,然后单击它会打开一个带有编辑文本的 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", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Canceled.
}
});
alert.show();
其次:- 是我构建了一个单独的 DialogFragment,它带有一个接口,用于将数据发送回片段,这感觉是一种最佳实践,但我遇到了很多问题,例如.. 当数据被发送回我的片段时,我不能对接收到的数据使用方法“textView.setText”,因为我在 onCreateView 方法之外接收它,因此 textView 总是 returns 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);
}
}
所以我的想法是我应该使用第一种方法,因为它更容易,而且更容易从中提取文本,但仍然不确定这是否是一个好的做法。
提前致谢!
这不是最佳实践的问题,而是您希望如何设计应用程序的问题。
- 第一种解决方案:您可以直接与您的UI进行交互。例如:在
textView
中设置新值。但是如果你写的对话比较多的话,想想把逻辑泛化一下(方案二)。
- 第二个解决方案:如果你只想要一个通用的
Dialog
,你需要 use-case 因为它 = 多次调用对话框并且不要忘记:如果你实例化对话框 class 如果你想在 UI 中更改它,你需要给他 textView
首选第二种解决方案:
- 您可以拥有自己的 自定义 UI 元素。
- 您可以访问 生命周期 更改(
onResume
、onCreate
等)。
- 即使方向改变了它也一直显示(第一个解决方案没有)。
为了将数据发送到上一个片段,您可以创建 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()
}
}
我有一个使用选项卡 activity 的应用,有 3 个选项卡,每个选项卡都有一个单独的片段和布局。 Tab3 有一些用户配置文件设置,例如名称。名称显示在 cardview 中,所以我使该 cardview 可点击,然后单击它会打开一个带有编辑文本的 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", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Canceled.
}
});
alert.show();
其次:- 是我构建了一个单独的 DialogFragment,它带有一个接口,用于将数据发送回片段,这感觉是一种最佳实践,但我遇到了很多问题,例如.. 当数据被发送回我的片段时,我不能对接收到的数据使用方法“textView.setText”,因为我在 onCreateView 方法之外接收它,因此 textView 总是 returns 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);
}
}
所以我的想法是我应该使用第一种方法,因为它更容易,而且更容易从中提取文本,但仍然不确定这是否是一个好的做法。
提前致谢!
这不是最佳实践的问题,而是您希望如何设计应用程序的问题。
- 第一种解决方案:您可以直接与您的UI进行交互。例如:在
textView
中设置新值。但是如果你写的对话比较多的话,想想把逻辑泛化一下(方案二)。 - 第二个解决方案:如果你只想要一个通用的
Dialog
,你需要 use-case 因为它 = 多次调用对话框并且不要忘记:如果你实例化对话框 class 如果你想在 UI 中更改它,你需要给他
textView
首选第二种解决方案:
- 您可以拥有自己的 自定义 UI 元素。
- 您可以访问 生命周期 更改(
onResume
、onCreate
等)。 - 即使方向改变了它也一直显示(第一个解决方案没有)。
为了将数据发送到上一个片段,您可以创建 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()
}
}