2010-06-17 6 views
4

J'ai une application avec une vue basée sur le SurfaceHolder (similaire au tutoriel Lunar Lander). L'interface graphique complète est dessinée sur un canevas et je souhaite être en mesure de demander la saisie de texte utilisateur à un moment donné en utilisant une boîte de dialogue de mise en page personnalisée, qui est ensuite prise en compte et rendue au canevas en utilisant la procédure standard.Ouverture d'une boîte de dialogue avec saisie de texte à partir d'une vue dans Android

Mon problème, cependant, est qu'il semble que la meilleure pratique consiste à ouvrir des dialogues à partir de l'activité. Ce n'est pas un problème non plus, car je pensais pouvoir créer un gestionnaire et le passer à la vue qui pourrait à son tour l'utiliser pour transmettre des messages du thread graphique de la vue à l'activité, qui à son tour pourrait récupérer l'entrée , et envoyer une réponse en arrière, etc

Le problème est, après que j'appelle setContentView(R.layout.main), qui contient l'application entière, je veux appeler MyAppView mMyAppView = (MyAppView) findViewById(R.id.app_view_id).

Cet appel renvoie null.

Qu'est-ce qui est considéré comme la meilleure pratique ici? Je n'arrive pas à trouver de bons exemples et l'API se présente, eh bien, pas grand-chose.

J'apprécierais toute aide ici.

Répondre

14

Créez une activité de dialogue à afficher sur votre activité actuelle.

public class TextEntryActivity extends Activity { 
    private EditText et; 

    /* 
    * (non-Javadoc) 
    * @see android.app.Activity#onCreate(android.os.Bundle) 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_text_entry); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 
       WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 
     // title 
     try { 
      String s = getIntent().getExtras().getString("title"); 
      if (s.length() > 0) { 
       this.setTitle(s); 
      } 
     } catch (Exception e) { 
     } 
     // value 

     try { 
      et = ((EditText) findViewById(R.id.txtValue)); 
      et.setText(getIntent().getExtras().getString("value")); 
     } catch (Exception e) { 
     } 
     // button 
     ((Button) findViewById(R.id.btnDone)).setOnClickListener(new OnClickListener() { 

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

    /* (non-Javadoc) 
    * @see android.app.Activity#onBackPressed() 
    */ 
    @Override 
    public void onBackPressed() { 
     executeDone(); 
     super.onBackPressed(); 
    } 

    /** 
    * 
    */ 
    private void executeDone() { 
     Intent resultIntent = new Intent(); 
     resultIntent.putExtra("value", TextEntryActivity.this.et.getText().toString()); 
     setResult(Activity.RESULT_OK, resultIntent); 
     finish(); 
    } 


} 

Lancement par:

Intent foo = new Intent(this, TextEntryActivity.class); 
foo.putExtra("value", "old value to edit"); 
this.startActivityForResult(foo, EDIT_ACTION); 

puis attraper la réponse sur onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      case EDIT_ACTION: 
       try { 
        String value = data.getStringExtra("value"); 
        if (value != null && value.length() > 0) { 
         //do something with value 
        } 
       } catch (Exception e) { 
       } 
       break; 
      default: 
       break; 
     } 
    } 

Manifest est défini comme:

<activity 
      android:name=".utils.TextEntryActivity" 
      android:label="Type in the value" 
      android:theme="@android:style/Theme.Dialog" /> 
+0

Merci! J'espérais que la solution n'impliquerait pas les intentions, mais c'était une solution élégante, pour ainsi dire! Appréciez, cela a résolu mon problème. – Gus

+1

Lorsque j'essaie d'utiliser ce code, j'obtiens 'activity_text_entry ne peut pas être résolu ou n'est pas un champ txtValue ne peut pas être résolu ou n'est pas un champ btnDone ne peut pas être résolu ou n'est pas un champ'. Ai-je raté quelque chose? –

0

Je cherche aussi à répondre à cette question pour moi-même. La réponse déjà là est bonne. La page de développeur android comme alter dialog samples.

Je n'ai pas lu complètement encore, mais si vous recherchez la balise

DIALOG_TEXT_ENTRY

cela semble être ce que vous (et moi) avez besoin. Je vais d'abord étudier cet exemple.

Questions connexes