2011-05-10 24 views
17

Kullanıcının bir parola girmesini isteyen bir iletişim kutusu görüntülemek için bir AlertDialog.Builder kullanıyorum, daha sonra bu parolayı bir tercihte kaydetmek istiyorum, ancak uyarı iletişim kutusunun girişinden nasıl sonuç alacağımı anlayamıyorum yöntem. Ben o zaman onCreateDialog(int) yöntemini kullanarak showDialog(int); gibi bir şey yapıyor ve bir şekilde sonuca ayarı ve bazı onu almaya açığımBir AlertDialog'dan sonuçları nasıl alabilirim?

String result; 
    AlertDialog.Builder b = new AlertDialog.Builder(this); 
    b.setTitle("Please enter a password"); 
    final EditText input = new EditText(this); 
    b.setView(input); 
    b.setPositiveButton("OK", new DialogInterface.OnClickListener() 
    { 
     @Override 
     public void onClick(DialogInterface dialog, int whichButton) 
     { 
      //I get a compile error here, it wants result to be final. 
      result = input.getText().toString(); 
     } 
    }); 
    b.setNegativeButton("CANCEL", null); 
    b.create().show(); 

Ancak: Burada

ben yapabilmek istiyorum aslında ne Diğer yöntem, ama son kısım hakkında nasıl gideceğimi bilmiyorum.

cevap

22
public class MyActivity extends Activity { 
    private String result; 

    void showDialog() { 
     AlertDialog.Builder b = new AlertDialog.Builder(this); 
     b.setTitle("Please enter a password"); 
     final EditText input = new EditText(this); 
     b.setView(input); 
     b.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton) { 
       result = input.getText().toString(); 
      } 
     }); 
     b.setNegativeButton("CANCEL", null); 
     b.show(); 
    } 
} 
3

Basitleştirilmiş örnek: yerine yerel değişkenin, bunu bir üye değişkeni yapmak,

public class Main extends Activity { 
    private Button btn; 
    private String result; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       showDialog(0); 
      } 
     }); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case 0: 
      final EditText input = new EditText(this); 

      return new AlertDialog.Builder(this) 
      .setIcon(R.drawable.icon) 
      .setTitle("Please enter a password") 
      .setView(input) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int whichButton) { 
        Toast.makeText(getBaseContext(), input.getText().toString(), Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int whichButton) { 
        Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show(); 
       } 
      }).create(); 
     } 

     return null; 
    } 
} 
+0

Üzgünüm veya ben başarmak için çalışıyorum başarmak için kullanabilir nasıl:

Olarak aşağıdaki kodları @finiteloop düzenleyin. – finiteloop

+0

@segfault, cevabımı düzenledim – evilone

+2

evilone, Observer şablonunu kullanmanızı ve kendi dinleyicinizi (TextListener) oluşturmanızı öneriyor.Bu AlertDialog'u barındıran Etkinliğiniz, daha sonra AlertDialog'un dışındaki onPositiveResult (CharSequence) öğesini çağıran TextListener'ı uygulayabilir ve sorunuzu temel alarak aradığınız sonuçtan geçer. Ardından sonucunuza istediğiniz gibi hareket edebilirsiniz. Doğru cevap için –

1

Değişken sonucu:

public interface TextListener { 
    void onPositiveResult(CharSequence text); 
} 

public static AlertDialog getTextDialog(Context ctx, 
     final TextListener listener) { 
    View view = LayoutInflater.from(ctx).inflate(R.layout.dialog, null); 
    final TextView tv = (TextView) view.findViewById(R.id.tv); 
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
    builder.setView(view); 
    // 
    builder.setPositiveButton(android.R.string.ok, new OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      listener.onPositiveResult(tv.getText()); 
     } 
    }); 
    builder.setNegativeButton(android.R.string.cancel, null); 
    return builder.create(); 
} 

- - DÜZENLEME Yoksa bu kodu deneyin. Üye değişkeni "sonuç" yaparak bu tüm aktiviteye erişilebilir (genişletmektedir ana sınıfı)

+0

+1. @ Femi'yi seçtim çünkü daha sağlamdı. Teşekkürler! – finiteloop

1

zayıf fakat hızlı çözüm.

bir Aktivite düzeyi yöntem bildirin:

TextView lblDiaDestination; 

public void dialogReturn(String msg){ 
    lblDiaDestination.setText(msg); 
} 

ve pozitif düğme tıklama Listner gelen çağrı:

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 
     dialogReturn( input.getText().toString().trim() ); 
    }); 

sadece() alert.show önce lblDiaDestination değerini değiştirebilirsiniz:

lblDiaDestination = myTextView; 
alert.show(): 
0

Bu oldukça uzun. Umarım katkılarım yeni gelenler için yararlı olabilir. Soruyu yanıtlamanın anahtarı, etkinliğin üyesi olarak sonucu sonucunu bildirmektir (buna YourActivity numaranız). Sonra "onClick" yönteminin içinden, bu değişkene erişmek için YourActivity.this.result kullanın. Ben oldukça, burada neler olduğunu anlamıyorum

public class YourActivity extends Activity { 
    private String result; 
    // other activity stuff 

    void showDialog(){ 
     AlertDialog.Builder b = new AlertDialog.Builder(this); 
     b.setTitle("Please enter a password"); 
     final EditText input = new EditText(this); 
     b.setView(input); 
     b.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton) {   
       YourActivity.this.result = input.getText().toString(); 
      } 
     }); 
     b.setNegativeButton("CANCEL", null); 
     b.create().show(); 
    } 
} 
İlgili konular