问题描述
我有一个使用选项卡式活动的应用程序,其中包含3个选项卡,每个选项卡具有单独的片段和布局。 Tab3具有一些用户配置文件设置,例如名称。名称显示在cardview内,因此我使cardview可以单击,然后onClick它将打开一个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",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",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
,则需要用例=多次调用对话框,不要忘记:如果您实例化Dialog类,则需要给他textView
,如果要在用户界面中进行更改
首选第二个解决方案:
- 您可以拥有自定义用户界面元素。
- 您有权访问生命周期更改(
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()
}
}