대화 상자를 표시하고 대화 상자가 닫힐 때까지 기다린 다음 대화 상자 내용에 따라 결과를 반환하는 메서드를 구현하고 싶습니다. 이것이 가능한가? Android : 대화 상자에서 사용자 입력을 기다리시겠습니까?
public String getUserInput()
{
//do something to show dialog
String input = //get input from dialog
return input;
}
내가 실제로 방법이있는 인터페이스를 구현하기 위해 노력하고 있습니다 "공공 문자열 getUserInput()", 반환 된 문자열은 대화 상자를 통해 검색해야하는 경우. 이것은 자바에서 쉽게 이루어지며, 안드로이드에서는 불가능한 것처럼 보입니까?
편집 : 백그라운드 스레드 (내가 AsynchTask에서 호출)에서 호출되어야 코멘트
getInput()
의 요청에 따라 몇 가지 예제 코드를 게시. getInput()은 대화 상자를 표시하고 wait를 호출합니다. 대화 상자에서 확인 버튼을 누르면 대화 상자에서 사용자 변수를 멤버 변수로 설정하고 알림을 호출합니다. 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 스레드에서 차단 항목을 실행하지 마십시오. –