2010-06-17 22 views
4

我有一個基於SurfaceHolder的視圖(類似於Lunar Lander教程)的應用程序。 整個圖形用戶界面繪製在畫布上,我希望能夠在給定時刻使用自定義佈局對話框提示用戶輸入文字,然後使用標準程序將其處理並呈現到畫布。在Android視圖中打開一個文本輸入的對話框

但是,我的問題是,似乎最好的做法是從活動中打開對話框。 這也不算什麼問題,因爲我認爲我可能會創建一個Handler,然後將它傳遞給View,它可以反過來使用它將View中的GUI線程中的消息傳遞給Activity,而這又可以獲取輸入,併發回回復等。

問題是,我打電話給setContentView(R.layout.main),其中包含整個應用程序,我想打電話給MyAppView mMyAppView = (MyAppView) findViewById(R.id.app_view_id)

此致電返回null

什麼被認爲是最佳實踐在這裏?我找不到任何好的例子,而且API已經出現了,好吧,沒有多少。

我很感謝這裏的任何幫助。

回答

14

創建一個對話主題活動以顯示當前活動。

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


} 

啓動方式:

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

然後捉對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; 
     } 
    } 

清單的響應被定義爲:

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

謝謝! 我希望解決方案不涉及意圖,但這是一個優雅的解決方案,因爲它是! 欣賞它,這解決了我的問題。 – Gus 2010-06-17 18:37:15

+1

當我嘗試使用此代碼時,我得到'activity_text_entry無法解析或不是字段 txtValue無法解析或不是字段 btnDone無法解析或不是字段。 我錯過了什麼嗎? – 2011-09-16 13:44:30

0

我也期待來回答這個問題爲了我自己。答案已經在這裏是一個很好的答案。 Android開發者頁面作爲改變對話框samples

我沒有看過它完全還,但如果搜索標籤

DIALOG_TEXT_ENTRY

這似乎是你(和我)需要什麼。

我打算先調查一下這個例子。