【问题标题】:Empty EditText value displayed in AlertDialogAlertDialog 中显示的空 EditText 值
【发布时间】:2020-09-20 08:07:05
【问题描述】:

我是 Android 开发新手,但遇到了问题。我有 2 个EditText 登录名和密码字段和 1 个Button。当我点击Button 时,我得到AlertDialog 并带有消息“以身份登录”,但我需要它是“以*值登录”进入“登录”@ 987654325@”。 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();
    }
}

【问题讨论】:

    标签: java android android-studio android-edittext android-alertdialog


    【解决方案1】:

    我想以你做了什么开始回答:

    您夸大了 2 个与以下相同的布局:

    1. View view2 = inflater.inflate(R.layout.fragment_first, null, false);
    2. return inflater.inflate(R.layout.fragment_first, container, false);

    我们将第二次膨胀称为view1,它是为Fragment 膨胀的原始视图,也是onViewCreated() 方法中返回的视图。

    然后,为view1button_first 设置onClickListener

    然后,在handleDialogLogin() 方法中,您尝试获取使用view2 对象创建的EditText 字段的文本值。
    这就是问题所在。因为,在应用程序使用期间,您将文本插入到 view1EditText 字段中,但您要求 view2EditText 字段的文本值显然是空的。

    正确和干净的方法在这里:

    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();
        }
    }
    

    【讨论】:

    • 完美运行!谢谢 :) 我想,inflate() 方法只是获取视图实例,您可以随时这样做以获得一些价值。好像不是。所以如果我重新膨胀一些视图,我在程序中已经用它做的所有事情都会丢失?
    • 我认为它们都存在,并且您之前夸大的视图(即 view2)被后来的夸大视图(即 view1)覆盖。因此,您不能在该视图中输入任何内容,因为它不是焦点,但后者是焦点。您可以尝试检查 EditText 对象是否在原始代码中的 handleLoginDialog 方法中是 null。我的猜测是它们是非空的,但它们将始终保持为空,并且会在整个 Fragment 被销毁时被销毁。
    【解决方案2】:

    也许你可以试试这个,但这不使用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();
    }
    

    【讨论】:

      【解决方案3】:

      安全的一面是在handleLoginDialog 方法中将loginText 作为字符串参数发送,并在那里检查字符串是否为空。

      【讨论】:

      • 它是空的,但我不知道为什么。就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多