Android开发:使用DialogFragment获取EditText值并展示的实现方案
1. 主Activity布局文件 (activity_main.xml)
这个布局包含两个用于展示结果的TextView,以及触发弹窗的按钮:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.eugene.myapplication.MainActivity"> <TextView android:id="@+id/textview_GoalName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:gravity="center_horizontal" android:text="Here will be your Goal Name" android:textSize="30sp" /> <TextView android:id="@+id/textview_GoalAmount" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/textview_GoalName" android:gravity="center_horizontal" android:text="Here will be your Goal Amount" android:textSize="30sp" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview_GoalAmount" android:layout_centerHorizontal="true" android:text="Create a Goal!" /> </RelativeLayout>
2. DialogFragment布局文件 (layout_dialog.xml)
注意补充上闭合的</RelativeLayout>标签,原代码里漏了:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <EditText android:id="@+id/edit_goalName" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Goal Name"/> <EditText android:id="@+id/edit_goalAmt" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/edit_goalName" android:hint="Goal Amount" android:inputType="number" /> </RelativeLayout>
3. 主Activity代码 (MainActivity.java)
通过实现DialogFragment定义的接口,接收弹窗传递回来的输入值并更新UI:
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements ExampleDialog.ExampleDialogListener { private TextView textViewGoalName; private TextView textViewGoalAmt; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewGoalName = findViewById(R.id.textview_GoalName); textViewGoalAmt = findViewById(R.id.textview_GoalAmount); button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { openDialog(); } }); } public void openDialog(){ ExampleDialog exampleDialog = new ExampleDialog(); exampleDialog.show(getSupportFragmentManager(), "example dialog"); } @Override public void applyTexts(String goalName, String goalAmount) { textViewGoalName.setText(goalName); textViewGoalAmt.setText(goalAmount); } }
4. DialogFragment代码 (ExampleDialog.java)
修复了原代码里字符串比较错误(Java里不能用==判断字符串为空,改用TextUtils.isEmpty()更可靠),同时完善了非空校验逻辑:
import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDialogFragment; public class ExampleDialog extends AppCompatDialogFragment { private EditText editTextGoalName; private EditText editTextGoalAmt; private ExampleDialogListener listener; @Override public AlertDialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.layout_dialog,null); builder.setView(view) .setTitle("Create Goal") .setNegativeButton("Maybe next time..", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i){ // 点击取消直接关闭弹窗,无需额外操作 } }) .setPositiveButton("Start!", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i){ String goalName = editTextGoalName.getText().toString().trim(); String goalAmt = editTextGoalAmt.getText().toString().trim(); String message = "Fields Required"; // 修复字符串为空的判断逻辑 if (TextUtils.isEmpty(goalName) && TextUtils.isEmpty(goalAmt)){ Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); return; // 校验不通过时不执行后续传值操作 } // 把输入值传递给主Activity listener.applyTexts(goalName, goalAmt); } }); editTextGoalName = view.findViewById(R.id.edit_goalName); editTextGoalAmt = view.findViewById(R.id.edit_goalAmt); return builder.create(); } @Override public void onAttach(Context context) { super.onAttach(context); try { listener = (ExampleDialogListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " Must implement ExampleDialogListener"); } } // 定义回调接口,用于Fragment向Activity传递数据 public interface ExampleDialogListener{ void applyTexts(String goalName, String goalAmount); } }
关键说明
- 接口回调机制:这是Android中Fragment与Activity通信的标准方式,通过
ExampleDialogListener接口,DialogFragment可以把输入值传递给实现了该接口的MainActivity。 - 非空校验优化:用
TextUtils.isEmpty()判断字符串为空,同时给输入内容做了trim()处理,避免用户输入空格导致的无效内容。 - 代码健壮性:在非空校验不通过时,用
return终止后续操作,避免空值传递到主Activity。
内容的提问来源于stack exchange,提问作者Waffles
相关产品推荐
相关产品推荐

