在Android中的视图中打开带有文本输入的对话框

时间:2010-06-17 11:33:49

标签: android dialog user-input

我有一个基于SurfaceHolder的View应用程序(类似于Lunar Lander教程)。 整个GUI在画布上绘制,我希望能够使用自定义布局对话框在给定时刻提示用户文本输入,然后使用标准过程处理并渲染到画布。

然而,我的问题是,最佳做法似乎是从Activity中打开Dialogs。 这也没问题,因为我认为我可能会创建一个Handler,然后将其传递给View,而View又可以使用它将来自View视图中的GUI线程的Message传递给Activity,而这又可以获取输入,并发送回复等

问题是,在我拨打包含整个应用的setContentView(R.layout.main)后,我想拨打MyAppView mMyAppView = (MyAppView) findViewById(R.id.app_view_id)

此调用返回null

这里被认为是最佳做法?我找不到任何好的例子,A​​PI正在出现,好吧,并不多。

我很感激这里的任何帮助。

2 个答案:

答案 0 :(得分: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" />

答案 1 :(得分:0)

我也想为自己回答这个问题。这里的答案很好。 android开发者页面为alter dialog samples

我尚未完全阅读,但如果你搜索标签

DIALOG_TEXT_ENTRY

这似乎是你(和我)所需要的。

我将首先调查这个例子。