私は、ダイアログを表示し、ダイアログが閉じられるまで待ってから、ダイアログの内容に応じて結果を返すメソッドを実装したいと思います。これは可能ですか?Android:ダイアログからユーザー入力を待ちますか?
public String getUserInput()
{
//do something to show dialog
String input = //get input from dialog
return input;
}
私は実際に返される文字列はダイアログを経由して取得しなければならない方法「のパブリック文字列getUserInputを()」、持っているインターフェイスを実装しようとしています。これは簡単にJavaで行われ、アンドロイドで不可能と思われる?
EDIT:バックグラウンドスレッド(私はAsynchTaskからそれを呼び出す)から呼び出されなければなりませんコメント
getInput()
に要求されるようにいくつかのサンプルコードを投稿。 getInput()はダイアログを表示し、waitを呼び出します。ダイアログ上で[OK]ボタンを押すと、ダイアログはメンバー変数にユーザー入力を設定し、通知を呼び出します。 notifyが呼び出されると、getInput()が続行され、メンバー変数が返されます。
/**
*
*/
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
* @author
*/
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();
}
}
立ち上げを行うだろう。このような
String m_Input;
public synchronized String getInput()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
AlertDialog.Builder alert = new AlertDialog.Builder(context);
//customize alert dialog to allow desired input
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
m_Input = alert.getCustomInput();
notify();
}
});
alert.show();
}
});
try
{
wait();
}
catch (InterruptedException e)
{
}
return m_Input;
}
UIスレッドで呼び出されるメソッドでユーザーを待つことはできません。したがって、プログラムフローのイベントドリブンモデルに切り替えるか、バックグラウンドメソッドが何を待っていたとしても、ユーザーアクションの更新に応じてUIスレッドでonWhatever()メソッドが呼び出されるまで待つことができるバックグラウンドスレッドから呼び出す必要があります。 –
私は本当に理解していない、バックグラウンドスレッドからこれを呼び出す方法を説明し、次に私の文字列をonWhatever()返しますか? – ab11
3(?)以上のUIスレッドをブロックしている場合は、アプリケーションを終了するかどうかを尋ねるANRダイアログポップアップが表示されるのは3秒だと思います。 AndroidのUIスレッドでブロッキングを実行しないでください。 –