Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AlertDialog中显示的EditText值为空_Java_Android_Android Studio_Android Edittext_Android Alertdialog - Fatal编程技术网

Java 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

我是Android开发的新手,遇到了一个问题。我有两个文本字段,分别是登录名和密码,还有一个按钮。当我点击该按钮时,我将收到AlertDialog,其中的消息登录为,但我需要它以*值登录到登录编辑文本中。 EditText值始终为空。这只是一个简单的实现,但不起作用。 我做错了什么

代码如下:

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。我的猜测是,它们是非空的,但它们将始终保持为空,并在整个片段被销毁时被销毁。