Java AlertDialog中显示的EditText值为空
我是Android开发的新手,遇到了一个问题。我有两个文本字段,分别是登录名和密码,还有一个按钮。当我点击该按钮时,我将收到AlertDialog,其中的消息登录为,但我需要它以*值登录到登录编辑文本中。 EditText值始终为空。这只是一个简单的实现,但不起作用。 我做错了什么 代码如下:Java AlertDialog中显示的EditText值为空,java,android,android-studio,android-edittext,android-alertdialog,Java,Android,Android Studio,Android Edittext,Android Alertdialog,我是Android开发的新手,遇到了一个问题。我有两个文本字段,分别是登录名和密码,还有一个按钮。当我点击该按钮时,我将收到AlertDialog,其中的消息登录为,但我需要它以*值登录到登录编辑文本中。 EditText值始终为空。这只是一个简单的实现,但不起作用。 我做错了什么 代码如下: public class FirstFragment extends Fragment { EditText loginText; EditText passwText; @Ove
public class FirstFragment extends Fragment {
EditText loginText;
EditText passwText;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
View view2 = inflater.inflate(R.layout.fragment_first, null, false);
loginText = (EditText)view2.findViewById(R.id.loginText);
passwText = (EditText)view2.findViewById(R.id.passText);
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false);
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick( View view) {
handleLoginDialog();
}
});
}
private void handleLoginDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//View view2 = getLayoutInflater().inflate(R.layout.fragment_first, null, false);
String st = loginText.getText().toString();
if (loginText != null && passwText != null){
builder.setMessage("Logged in as " + st);
}
else
builder.setMessage("Login or password was not entered!" );
builder.show();
}
}
也许您可以试试这个,但它不使用onViewCreated
public class FirstFragment extends Fragment {
EditText loginText;
EditText passText;
Button btnLogin;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
View view2 = inflater.inflate(R.layout.fragment_first, null, false);
loginText = (EditText)view2.findViewById(R.id.loginText);
passText = (EditText)view2.findViewById(R.id.passText);
btnLogin = (Button) view2.findViewById(R.id.button_first);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleLoginDialog();
}
});
return view2;
}
private void handleLoginDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//View view2 = getLayoutInflater().inflate(R.layout.fragment_first, null, false);
String st = loginText.getText().toString().trim();
String pt = passText.getText().toString().trim();
if (st.isEmpty() && pt.isEmpty()){
builder.setMessage("Login or password was not entered!" );
}
else
builder.setMessage("Logged in as " + st);
builder.show();
}
安全的一面是将loginText作为handleLoginDialog方法中的字符串参数发送,并在那里检查字符串是否为空。我想用您所做的开始回答: 您添加了两个相同的布局,如下所示: 视图view2=充气机.充气机.LAYOU.FRAMENT_first,null,false; 首先返回充气器。充气器。布局。碎片_,容器,错误; 让我们将第二个膨胀称为view1,它是为片段膨胀的原始视图,也是onViewCreated方法中返回的视图 然后,为view1的第一个按钮设置onClickListener 然后,在handleDialogLogin方法中,尝试获取使用view2对象创建的EditText字段的文本值。 这就是问题所在。因为,在应用程序使用期间,您在view1的EditText字段中插入文本,但您要求的是view2的EditText字段的文本值,该值显然为空 正确和干净的方法如下:
public class FirstFragment extends Fragment {
EditText loginText;
EditText passwText;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
// just inflate the layout for this fragment as it is not correct
// place for declaring and initializing views
return inflater.inflate(R.layout.fragment_first, container, false);
}
// this is the best place for declaring and initializing views
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// declare and initialize your EditText here
loginText = (EditText)view.findViewById(R.id.loginText);
passwText = (EditText)view.findViewById(R.id.passText);
view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick( View view) {
handleLoginDialog();
}
});
}
private void handleLoginDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
String st = loginText.getText().toString().trim();
String pt = passText.getText().toString().trim();
if (st.isEmpty() && pt.isEmpty())
builder.setMessage("Login or password was not entered!" );
else
builder.setMessage("Logged in as " + st);
builder.show();
}
}
它是空的,但我不知道为什么。就是这样,很好用!谢谢:我想,膨胀方法只是获取视图实例,您可以随时这样做以获得一些值。看起来不是。所以,如果我重新膨胀一些视图,我在程序中已经用它做的所有事情都会丢失?我认为它们都存在,并且您先前膨胀的视图(即view2)被后来膨胀的视图(即view1)覆盖。因此,您不能在该视图中输入任何内容,因为它不在焦点中,但后一个视图在焦点中。您可以尝试在原始代码的handleLoginDialog方法中检查EditText对象是否为null。我的猜测是,它们是非空的,但它们将始终保持为空,并在整个片段被销毁时被销毁。