【问题标题】:EditText getText() returns empty stringEditText getText() 返回空字符串
【发布时间】:2014-01-30 17:12:52
【问题描述】:

我有一个带有按钮的活动,当用户单击该按钮时,会出现一个带有 2 EditText 的 AlertDialog,您可以在其中输入电子邮件和密码以登录。 当我尝试从 EditText 获取文本时,我总是只得到空字符串。 布局 login_alert 是 AlertDialog 的布局。 代码如下:

    View view = getLayoutInflater().inflate(R.layout.login_alert, null, false);
    String email = ((EditText) view.findViewById(R.id.emailEditText)).getText().toString();
    String password = ((EditText) view.findViewById(R.id.passwordEditText)).getText().toString();

    System.out.println("DEBUG: "+email+", "+password); // Empty strings

编辑: 活动代码:

    public class MainActivity extends FragmentActivity {

    public static final String mAPP_ID = "...";
    public static final String USER_DB_URL = "...";

    AssetsExtracter mTask;

    private MainFragment mainFragment;
    private List<User> usersList = new ArrayList<User>();
    private User currentUser = null;

    private Button labLoginButton;
    private EditText emailET;
    private EditText passwordET;

    private ProgressDialog dialog;
    private View alertView; /* THIS IS THE SOLUTION */

    boolean userIsLogged = false;

    static {
        IMetaioSDKAndroid.loadNativeLibs();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        setContentView(R.layout.activity_main);

        /*View view = getLayoutInflater().inflate(R.layout.login_alert, null, false); BEFORE*/
            alertView = getLayoutInflater().inflate(R.layout.login_alert, null, false);
        emailET = (EditText) view.findViewById(R.id.emailEditText);
        passwordET = (EditText) view.findViewById(R.id.passwordEditText);

        labLoginButton = (Button) findViewById(R.id.loginLabButton);
        updateLoginButton();

        dialog = new ProgressDialog(this);
        dialog.setMessage("Signin in...");

        if (savedInstanceState == null) {
            // Add the fragment on initial activity setup
            mainFragment = new MainFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(android.R.id.content, mainFragment).commit();
        } else {
            // Or set the fragment from restored state info
            mainFragment = (MainFragment) getSupportFragmentManager()
                    .findFragmentById(android.R.id.content);
        }

        mTask = new AssetsExtracter();
        mTask.execute(0);

    }

    /* THIS METHOD IS CALLED BY THE LOGIN BUTTON IN THE MAIN ACTIVITY LAYOUT */
    public void onLabLoginButtonClick(View v) {
        if (userIsLogged) {
            currentUser = null;
            userIsLogged = false;
            updateLoginButton();
            Toast.makeText(this, "Disconnected from Lab", Toast.LENGTH_SHORT)
                    .show();
        } else {
            /*View messageView = getLayoutInflater().inflate(
                    R.layout.login_alert, null, false); BEFORE */

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setIcon(R.drawable.icon_launcher);
            builder.setTitle(R.string.login_string);
            builder.setView(alertView); /* USING THE GLOBAL VARIABLE */
            builder.setPositiveButton("Sign me", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface d, int which) {
                    dialog.show();

                    // Download user and return a List of User
                    DownloadFilesAsyncTask task = new DownloadFilesAsyncTask(USER_DB_URL) {
                        @Override
                        protected void onPostExecute(final List<User> result) {
                            usersList = result;
                            loginCheckRoutine(); //HERE I MANAGE THE LOGIN AND GETTING EMPTY STRING
                        }
                    };
                    task.execute();
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub

                }
            });
            builder.create();
            builder.show();
        }
    }

    public void updateLoginButton() {
        if (userIsLogged) {
            labLoginButton.setText(R.string.logout_string);
        } else {
            labLoginButton.setText(R.string.login_string);
        }
    }

    public void loginCheckRoutine() {


        String email = emailET.getText().toString();
        String password = passwordET.getText().toString();

        System.out.println("DEBUG: " + email + ", " + password); // EMPTY

        // controllo nella lista se c'è l'utente coi dati inseriti
        for (int i = 0; i < usersList.size(); i++) {
            if (usersList.get(i).getEmail().equals(email)
                    && password.equals("admin")) {
                currentUser = usersList.get(i);
                userIsLogged = true;
                updateLoginButton();
                dialog.dismiss();
                break;
            }
        }
        if (!userIsLogged) {
            userIsLogged = false;
            updateLoginButton();
            dialog.dismiss();
            Toast.makeText(MainActivity.this, "Login Failed",
                    Toast.LENGTH_SHORT).show();
        }
    }

}

问题已解决,解决方案: 在 onCreate() 中,我在 View 变量中扩充了 alert_dialog 布局。我将 View 变量设为全局变量(在 onCreate() 之前),然后在 onLabLoginButtonClick() 中我没有再次膨胀视图,但我使用在 onCreate() 中实例化的全局变量。希望它清楚。谢谢大家!

【问题讨论】:

  • 你能显示警报拨号代码吗

标签: android string android-edittext


【解决方案1】:

getText刚刚初始化。直到你在 xml 中有文本,你才会得到文本。在alertdialog按钮的onclick中获取文本。

声明

EdiText ed1,ed2; // before onCreate if in activity and onCraeteView in fragment

作为实例变量

View view = getLayoutInflater().inflate(R.layout.login_alert, null, false);
ed1= (EditText) view.findViewById(R.id.emailEditText))
ed2 = (EditText) view.findViewById(R.id.emailEditText);

然后在警报对话框上单击按钮

  String email = ed1.getText().toString();
  String password= ed2.getText().toString()

【讨论】:

  • 如果我这样做,无论如何我都会得到空字符串。对不起,我应该发布所有代码,我编辑问题。
  • @Cardella 我在您的代码中没有看到警报对话框。你只增加了一个视图,没有对话框,也没有添加到活动中
  • @Cardella asynctask的doInbackground在哪里?/
  • asynckTask 是我创建的一个类,是 AsyncTask 的子类,doInbackground() 下载文件并获取 json 用户。我调试了它,它可以工作!我通过单击 Main Activity 中的按钮创建的 AlertDialog,它可以工作
  • @Cardella 在警报对话框中有一个按钮,然后单击该按钮获取文本。那可行。喜欢确定并取消。在确定的 clikc 上获取文本。点击取消关闭对话框。
【解决方案2】:

当你点击警告对话框的登录按钮时,你必须得到文本

上面提到的代码当你显示警告对话框时你会得到文本它总是返回空字符串你应该遵循以下过程 首先,您制作一个自定义警报框布局,其中包含两个编辑文本和一个按钮 用户将文本写入edittext以进行登录并提供密码,然后单击登录按钮 当您调用登录按钮单击侦听器时,您可以轻松获取edittext的文本

【讨论】:

    【解决方案3】:

    您试图在膨胀视图后立即获取文本。尝试在用户单击完成按钮时执行此操作。

    【讨论】:

    • 我最初发布的代码在登录按钮的 onClickListener 中...也许我应该在 onCreate() 中膨胀视图并使用 View 全局变量?
    【解决方案4】:

    在onCreate之前添加:

    EditText email;
    EditText pass;
    

    在你的 onCreate 中添加这个

    etEmail (EditText) view.findViewById(R.id.emailEditText);
    etPass (EditText) view.findViewById(R.id.emailEditText);
    

    然后将其添加到单击按钮时

    String email = etEmail.getText().toString();
    String pass = etEmail.getText().toString();
    

    【讨论】:

    • 谢谢史蒂文。我将带有 getText() 声明的字符串放在 public void OnClick 方法中,我不再得到 NULL。
    【解决方案5】:

    只要确保editText.getText.toString()方法在OnClick()方法里面,例如:

    TextView submit = enquiryFragment.findViewById(R.id.query_submit_button);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v){
    
                query_type = query_type_editText.getText().toString();
                query_text = query_editText.getText().toString();
                if (query_text.length()!=0 && query_type.length()!=0) {
                    postQuery(query_type, query_text, store_id);
                   // Log.e("query_type ",query_type );
                }else{
                    Toast.makeText(getContext(), "Enter something !", Toast.LENGTH_SHORT).show();
                }
            }
        });
    

    【讨论】:

      【解决方案6】:

      或者在文本视图中添加一个 TextChangedListener 以在每次 textboxtext 更改时更改字符串。 textwatcher 也可以

      【讨论】:

        【解决方案7】:

        当您单击保存或完成按钮时,您应该会看到文本。 如果您在单击警报对话框按钮时收到此文本,您可能会多次使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2014-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          相关资源
          最近更新 更多