現在のアクティビティをフリーズできるかどうかを知りたいのですが、別のアクティビティやダイアログ(何でもかまいません)が完了するのを待っています。
結果のアクティビティを開始してそこで処理できることはわかっていますが、startActivityForResult()の後のコードは引き続き実行されます
これは私がやりたいことです:
PopupDialog dialog = new PopupDialog(this,Android.R.style.Theme_Black_NoTitleBar);
dialog.show();
// wait here, and continue the code after the dialog has finishes
int result = getResultFromDialogSomehow();
if (result == 1){
//do something
}else{
//do something else
}
奇妙に聞こえるかもしれませんが、そのような機能を実現する方法を誰かに教えてもらえれば幸いです。
ダイアログの場合ダイアログの結果が必要な場合、ダイアログの結果を取得する方法が正しくありません。 Android=の代わりに、ダイアログボタンの選択後に実行できるコールバックメソッドがあります。
例えば
AlertDialog.Builder builder = new AlertDialog.Builder(getDialogContext());
builder.setMessage("Message");
builder.setPositiveButton("Yes", new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(this, "Yes", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
builder.setNegativeButton("No", new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(this, "Yes", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
builder.show();
このコードを実行すると、onClick
メソッド内のコードは実行されませんが、ダイアログのボタンをクリックすると実行されます。ダイアログのボタンのいずれかをクリックすると、コールバックメソッドが取得されますonClick
と実行されます。
onActivityResult
も使用できます
メインアクティビティの呼び出しstartActivityForResult(intent, 1); //here 1 is the request code
あなたのDialogクラス
Intent intent = new Intent();
intent.putExtra(....) //add data if you need to pass something
setResult(2,intent); //Here 2 result code
だからあなたの主な活動
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode == 2 && requestCode ==1){
//do something
}else{
//do something else
}
}
ダイアログでコールバックを使用して、ユーザーが選択した文字列または値を返します。
つまり、ダイアログにインターフェイスを実装します
結果を取得するためのダイアログボックスを実装する方法に関心があるが、なしを使用するonActivityResultを使用する場合は、ここにを使用した例を示します。コールバック。このようにして、どこからでもこのカスタムダイアログボックスを呼び出し、選択に応じて何かを行うことができます。
短い方法
public void getDialog(Context context, String title, String body,
DialogInterface.OnClickListener listener){
AlertDialog.Builder ab = new AlertDialog.Builder(context);
ab
.setTitle(title)
.setMessage(body)
.setPositiveButton("Yes", listener)
.setNegativeButton("Cancel", listener)
;//.show();
Dialog d=ab.create();
d.setCanceledOnTouchOutside(false);
d.show();
}
private void showDialog(){
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//DO
break;
case DialogInterface.BUTTON_NEGATIVE:
//DO
break;
}
}
};
getDialog(
this,
"Delete",
"Are you sure to delete the file?",
dialogClickListener
);
}
別の方法、すべてのアクションを1か所で定義できるため、ダイアログボックスのさまざまなバリエーションを実装する必要がある場合に適しています。
MyDialog.Java
public class MyDialog{
public void deleteDialog(Context context){
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
if(listener!=null)
listener.onDeleteDialogResponse(true);
break;
case DialogInterface.BUTTON_NEGATIVE:
if(listener!=null)
listener.onDeleteDialogResponse(false);
break;
}
}
};
AlertDialog.Builder ab = new AlertDialog.Builder(context);
ab.setMessage("Are you sure to delete?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("Cancel", dialogClickListener)
.show();
}
/** my listner */
public interface MyDialogListener{
public void onDeleteDialogResponse(boolean respononse);
}
private MyDialogListener listener;
public void setListener(MyDialogListener listener) {
this.listener = listener;
}
}
このように使用します
private void showDialog(){
MyDialog dialog=new MyDialog();
dialog.setListener(new MyDialog.MyDialogListener() {
@Override
public void onDeleteDialogResponse(boolean respononse) {
if(respononse){
//toastMe("yessss");
//DO SOMETHING IF YES
}else{
//toastMe("noooh");
//DO SOMETHING IF NO
}
}
});
dialog.deleteDialog(this);
}
onActivityResult
を使用できます。
これが私のコードです。
あなたが活動を開始したとき。例)MainActivityからTestActivityを呼び出すと、次のようになります。
Constants.REQUEST_CODE = 1000; // this is a global variable...and it must be a unique.
....
Intent intent = new Intent(this, TestActivity.class);
startActivityForResult(intent, Constants.REQUEST_CODE);
testActivityで。
public void onClickCancel() {
setResult(Activity.RESULT_CANCELED);
finish();
}
public void onClickConfirm() {
setResult(Activity.RESULT_OK);
finish();
}
mainActivityで結果コードを取得すると、次のようになります。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_OK) {
// todo something...
} else if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_CANCELED) {
// todo something...
}
}
ダイアログにボタンを付け、onClickListener
をアクティビティの何かへのメソッド呼び出しで実装してみてください。上記のメソッドのコードは、ボタンがクリックされたときにのみ実行されるため、ボタンの動作に応じて、ボタンの異なるパラメーターを使用してそのメソッドを呼び出します。
また、よくわかりません。アクティビティの結果を取得したい場合は、「startActivityForResult」関数を指定して開始するだけです。ダイアログでいくつかの結果をキャッチしたい場合は、ダイアログのすべてのボタンのonClickListenerにすべての関数(ダイアログのボタンを押した後も継続する必要があります)を単に配置できます。
私はこの質問への回答に数年遅れていますが、それでも私の回答です。
フォーム/ファイルを表すクラスがあります。オンデマンドでファイルを遅延できるパブリックメンバー「deleteDialog()」があり、呼び出し側に「true」または「false」の値を返します。
これは次のようになります。
import Android.app.AlertDialog;
import Android.content.Context;
import Android.content.DialogInterface;
public class Form {
private Context mContext;
private CharSequence mFilePath;
private boolean mDeleted = false; // Set to "true" if this file is deleted.
/*...etc etc...*/
public boolean deleteDialog() {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
//@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//Do your Yes progress
mDeleted = mContext.deleteFile(mFilePath.toString());
break;
case DialogInterface.BUTTON_NEGATIVE:
//Do your No progress
mDeleted = false;
break;
}
}
};
AlertDialog.Builder ab = new AlertDialog.Builder(mContext);
ab.setMessage("Are you sure to delete?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("Cancel", dialogClickListener)
.show();
return mDeleted;
}
結果の変数-"mDeleted"-は、囲んでいるクラスのメンバーでなければならないことがわかります。これは、Javaの奇妙ですが素晴らしい気まぐれによるものです。ここで、内部クラス(この場合: "DialogInterface.OnClickListener dialogClickListener")は、その外部クラスの状態を継承できます。