6

Ho cercato di aggiungere due elementi in un AlertDialog predefinito ma non riesco a farlo funzionare. Ecco il mio codice:Come aggiungere TextView e EditText utilizzando AlertDialog predefinito a livello di programmazione

// START Dialog 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 

    TextView tv = new TextView(this); 
    tv.setText(title); 
    tv.setPadding(40, 40, 40, 40); 
    tv.setGravity(Gravity.CENTER); 
    tv.setTextSize(20); 

    EditText et = new EditText(this); 
    etStr = et.getText().toString(); 

    alertDialogBuilder.setView(et); 
    alertDialogBuilder.setTitle(title); 
    alertDialogBuilder.setMessage("Input Student ID"); 
    alertDialogBuilder.setCustomTitle(tv); 

    if (isError) 
     alertDialogBuilder.setIcon(R.drawable.icon_warning); 
    // alertDialogBuilder.setMessage(message); 
    alertDialogBuilder.setCancelable(false); 

    // Setting Negative "Cancel" Button 
    alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      dialog.cancel(); 
     } 
    }); 

    // Setting Positive "Yes" Button 
    alertDialogBuilder.setPositiveButton("OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        if (isError) 
         finish(); 
        else { 
         Intent intent = new Intent(
           ChangeDeviceActivity.this, 
           MyPageActivity.class); 
         startActivity(intent); 
        } 
       } 
      }); 

    AlertDialog alertDialog = alertDialogBuilder.create(); 

    try { 
     alertDialog.show(); 
    } catch (Exception e) { 
     // WindowManager$BadTokenException will be caught and the app would 
     // not display the 'Force Close' message 
     e.printStackTrace(); 
    } 

Per ora, questo è solo un EditText con un messaggio impostato dal alertDialogBuilder.setMessage("Input Student ID"); ma voglio rendere questo un TextView modo che io possa centrare-giustificarlo. Come faccio a fare questo?

risposta

23
 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 

     LinearLayout layout = new LinearLayout(this); 
     LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.setLayoutParams(parms); 

     layout.setGravity(Gravity.CLIP_VERTICAL); 
     layout.setPadding(2, 2, 2, 2); 

     TextView tv = new TextView(this); 
     tv.setText("Text View title"); 
     tv.setPadding(40, 40, 40, 40); 
     tv.setGravity(Gravity.CENTER); 
     tv.setTextSize(20); 

     EditText et = new EditText(this); 
     etStr = et.getText().toString(); 
     TextView tv1 = new TextView(this); 
     tv1.setText("Input Student ID"); 

     LinearLayout.LayoutParams tv1Params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     tv1Params.bottomMargin = 5; 
     layout.addView(tv1,tv1Params); 
     layout.addView(et, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 

     alertDialogBuilder.setView(layout); 
     alertDialogBuilder.setTitle(title); 
     // alertDialogBuilder.setMessage("Input Student ID"); 
     alertDialogBuilder.setCustomTitle(tv); 

     if (isError) 
      alertDialogBuilder.setIcon(R.drawable.icon_warning); 
     // alertDialogBuilder.setMessage(message); 
     alertDialogBuilder.setCancelable(false); 

     // Setting Negative "Cancel" Button 
     alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       dialog.cancel(); 
      } 
     }); 

     // Setting Positive "OK" Button 
     alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       if (isError) 
        finish(); 
       else { 
         Intent intent = new Intent(ChangeDeviceActivity.this, 
         MyPageActivity.class); startActivity(intent); 
       } 
      } 
     }); 

     AlertDialog alertDialog = alertDialogBuilder.create(); 

     try { 
      alertDialog.show(); 
     } catch (Exception e) { 
      // WindowManager$BadTokenException will be caught and the app would 
      // not display the 'Force Close' message 
      e.printStackTrace(); 
     } 
+0

Questo funziona tuttavia volevo che 'tv1' fosse sopra EditText, quindi ho cambiato' layout.setOrientation (LinearLayout.HORIZONTAL); 'a' layout.setOrientation (LinearLayout.VERTICAL); 'ma sia' tv1' che 'et 'non è visualizzato? –

+1

ora verifica la modifica delle risposte per l'orientamento verticale. –

+0

Grazie mille! Lo apprezzo davvero. +1 per la parte modificata. –

1

Quando si chiama setView() l'originale TextView contenente il messaggio viene nascosto. È necessario

  • creare un piccolo xml layout e mettere l'EditText e un TextView ad esso
  • gonfiare il layout
  • ottenere riferimenti delle viste con findViewById()
  • fare qualcosa con il punto di vista
+0

Ma con questo, non sono riuscito a ottenere il layout della finestra di dialogo di avviso di Android o il tema di luce Holo. –

+0

Perché no? Il tema AlertDialog predefinito è impostato all'esterno. Basta passare una vista con childs invece di un semplice EditText. – flx

2

Creare un file .xml che includa la vista desiderata di seguito.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="312dp" 
     android:layout_height="wrap_content" 
     android:text="Enter your email address :" 
     android:layout_marginLeft="5dp" 
     android:textAppearance="?android:attr/textAppearanceSmall"/> 

<EditText 
     android:id="@+id/dialog1Edittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:layout_marginTop="10dp" 
     android:inputType="textEmailAddress"> 

    <requestFocus/> 
</EditText> 

Dopo che nei vostri attrezzi di file .java seguente codice.

View view = View.inflate(this, R.layout.yourxmlname, null); 
AlertDialog.Builder alert = new AlertDialog.Builder(this); 
// Now set the dialog's content 
alert.setContentView(view); 

Spero che ti aiuti.

+0

Grazie per questo, ma volevo utilizzare la finestra di avviso predefinita, quindi ho dovuto aggiungerla a livello di programmazione. –