2014-01-11 90 views
7

我有一個按鈕的活動,當用戶點擊按鈕時,一個AlertDialog與2 EditText出現在哪裏你把電子郵件和密碼登錄。 當我嘗試從EditText獲取文本時,我總是隻能得到空字符串。 佈局login_alert是AlertDialog的佈局。 這裏的代碼:EditText getText()返回空字符串

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

} 

問題解決了,SOLUTION: 在OnCreate()我膨脹在視圖變量alert_dialog佈局。我做了這個視圖變量全局(在onCreate()之前),然後在onLabLoginButtonClick()我再次膨脹視圖,但我使用onCreate()中的全局實例化。希望它清楚。謝謝你們!

+0

可以顯示報警代碼dialgo如果 – Raghunandan

回答

4

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() 
+0

我這樣做,我得到空字符串反正。 我問你,對不起,我應該發佈所有代碼,我編輯問題。 – Cardella

+0

@Cardella請編輯問題併發布代碼。 – Raghunandan

+0

@Cardella我在代碼中看不到警告對話框。你只infalte一個觀點,沒有對話,而不是加入到活動 – Raghunandan

1

你試圖讓你膨脹的觀點後,立即文本。嘗試在用戶單擊完成按鈕時執行此操作。

+0

我最初發布的代碼是在登錄按鈕的onClickListener ......也許我應該誇大在OnCreate(視圖),並使用查看全局變量? – Cardella

1

的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(); 
+0

我用完整的代碼編輯了這個問題。謝謝 – Cardella

+0

謝謝史蒂文。我把公共無效的OnClick方法中的getText()聲明字符串,我不再獲得NULL。 – gimmegimme

0

對你的TextView或者添加TextChangedListener每次更改文本框文本時更改字符串的更改。 一個textwatcher也可以

4

當你點擊警告對話框中的登錄按鈕

上述代碼你的文字,當你顯示警告對話框,它總是返回總是空的字符串,你應該跟着你必須獲取文本下面的過程 第一你做有兩個編輯文本和一個按鈕 用戶寫入文本自定義警告框佈局EDITTEXT進行登錄,給密碼,然後點擊登錄按鈕 當你調用登錄按鈕點擊監聽器,你可以得到的EditText文本easyly

0

you shoul d點擊保存或完成按鈕時獲取文本。 如果您在點擊警報對話框按鈕時看到此文本,最終可能會多次嘗試。

0

只要確保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(); 
      } 
     } 
    });