2013-08-24 7 views
5

私は、カスタマイズされたタイトルを表示するダイアログを再利用する方法を見つけようとしています。ダイアログを起動した機能にはい/いいえのクリックを送信します。AndroidでYes/NoのAlertDialogを再利用するにはどうすればよいですか?

「保存しておきますか?」と「変更を取り消す」の2つのボタンがあります。

私の手続きは非常に「汚い」と思うが、うまくいくと思うが、私の問題は「ビューの表示」変数で、アクティビティからダイアログに渡す方法がわからないのでダイアログを起動した関数を呼び出すために使用します。事前に

おかげで、私の活動の HerniHdez

の.java(それのフラグメント)

public void open_HH_Fragment_YesNo(View view, String aux_title, String aux_function) 
{ 
    Bundle bundle=new Bundle(); 
    bundle.putString("setMessage", aux_title); 
    bundle.putString("callingFunction", aux_function); 

    DialogFragment newFragment = new HH_Fragment_YesNo(); 
    newFragment.setArguments(bundle); 
    newFragment.show(getSupportFragmentManager(), "HH_Fragment_YesNo"); 
} 

public void SaveChanges(View view, String aux_YesNo) 
{ 
    if (aux_YesNo == "") 
    { 
     Toast.makeText(this, "Save changes?", Toast.LENGTH_SHORT).show(); 
     open_HH_Fragment_YesNo(view, "Save changes?", "SaveChanges"); 
    } 
    else if (aux_YesNo == "Yes") 
    { 
     Toast.makeText(this, "Saving changes", Toast.LENGTH_SHORT).show(); 
    } 
    else if (aux_YesNo == "No") 
    { 
     Toast.makeText(this, "Save Cancelled", Toast.LENGTH_SHORT).show(); 
    } 
} 

public void DismissChanges(View view, String aux_YesNo) 
{ 
    if (aux_YesNo == "") 
    { 
     Toast.makeText(this, "Dismiss changes?", Toast.LENGTH_SHORT).show(); 
     open_HH_Fragment_YesNo(view, "Dismiss changes?", "DismissChanges"); 
    } 
    else if (aux_YesNo == "Yes") 
    { 
     Toast.makeText(this, "Dismiss OK", Toast.LENGTH_SHORT).show(); 
     Close(view); 
    } 
    else if (aux_YesNo == "No") 
    { 
     Toast.makeText(this, "Dismiss Cancelled", Toast.LENGTH_SHORT).show(); 
    } 
} 

// The dialog fragment receives a reference to this Activity through the 
// Fragment.onAttach() callback, which it uses to call the following methods 
// defined by the HH_Fragment_YesNo.YesNoDialogListener interface 
@Override 
public void onDialogPositiveClick(DialogFragment dialog, View view, String aux_function) 
{ 
    // User touched the dialog's positive button 
    Toast.makeText(this, "User clicked on Yes", Toast.LENGTH_SHORT).show(); 

    if (aux_function == "SaveChanges") 
    { 
     SaveChanges(view, "Yes"); 
    } 
    else if (aux_function == "DismissChanges") 
    { 
     DismissChanges(view, "Yes"); 
    } 
} 

@Override 
public void onDialogNegativeClick(DialogFragment dialog, View view, String aux_function) 
{ 
    Toast.makeText(this, "User clicked on NO", Toast.LENGTH_SHORT).show(); 

    if (aux_function == "SaveChanges") 
    { 
     SaveChanges(view, "No"); 
    } 
    else if (aux_function == "DismissChanges") 
    { 
     DismissChanges(view, "No"); 
    } 
} 

私のダイアログの.javaファイル(完了)

public class HH_Fragment_YesNo extends DialogFragment 
{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    String setMessage = getArguments().getString("setMessage"); 
    final String callingFunction = getArguments().getString("callingFuntion"); 

    builder 
     .setMessage(setMessage)            // R.string.dialog_fire_missiles 
     .setPositiveButton("Sí", new DialogInterface.OnClickListener()  // R.string.fire 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       // Exit without saving 
       mListener.onDialogPositiveClick(HH_Fragment_YesNo.this, view, callingFunction); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener()  // R.string.cancel 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       // User cancelled the dialog 
       mListener.onDialogNegativeClick(HH_Fragment_YesNo.this, view, callingFunction); 
      } 
     }); 

    // Create the AlertDialog object and return it 
    return builder.create(); 
} 


/* The activity that creates an instance of this dialog fragment must 
* implement this interface in order to receive event callbacks. 
* Each method passes the DialogFragment in case the host needs to query it. */ 
public interface YesNoDialogListener 
{ 
    public void onDialogPositiveClick(DialogFragment dialog, View view, String aux_Function); 
    public void onDialogNegativeClick(DialogFragment dialog, View view, String aux_Function); 
} 


// Use this instance of the interface to deliver action events 
YesNoDialogListener mListener; 


// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener 
@Override 
public void onAttach(Activity activity) 
{ 
    super.onAttach(activity); 
    // Verify that the host activity implements the callback interface 
    try 
    { 
     // Instantiate the NoticeDialogListener so we can send events to the host 
     mListener = (YesNoDialogListener) activity; 
    } 
    catch (ClassCastException e) 
    { 
     // The activity doesn't implement the interface, throw exception 
     throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); 
    } 
} 
} 

答えて

4

解決策を試してみよう

1)Createaインタフェース

import android.content.DialogInterface; 

public interface AlertMagnatic { 

    public abstract void PositiveMethod(DialogInterface dialog, int id); 
    public abstract void NegativeMethod(DialogInterface dialog, int id); 
} 

2)確認ダイアログのための方法を一般化します。このページは、Googleで最初のヒットであり、それはので、少しそれについて、私はよ書かれたと、そのような一般的な作業のように思えるので

getConfirmDialog(getString(R.string.logout), getString(R.string.logout_message), getString(R.string.yes), getString(R.string.no), false, 
       new AlertMagnatic() { 

        @Override 
        public void PositiveMethod(final DialogInterface dialog, final int id) {} 

        @Override 
        public void NegativeMethod(DialogInterface dialog, int id) { 

        } 
       }); 
+0

ありがとうBiraj、 私はコードのすべての部分をどこに置く必要があるのか​​分かりません。 *インタフェースが別のファイルまたはアクティビティのJavaファイルに含まれていますか? –

+0

パッケージに別ファイルとして入れることをお勧めします。 –

+0

「確認ダイアログの一般化メソッド」は、ダイアログのJavaファイルとアクティビティファイルの「使用方法」にありますか? –

5

を使用する方法

public static void getConfirmDialog(Context mContext,String title, String msg, String positiveBtnCaption, String negativeBtnCaption, boolean isCancelable, final AlertMagnatic target) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 

     int imageResource = android.R.drawable.ic_dialog_alert; 
     Drawable image = mContext.getResources().getDrawable(imageResource); 

     builder.setTitle(title).setMessage(msg).setIcon(image).setCancelable(false).setPositiveButton(positiveBtnCaption, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       target.PositiveMethod(dialog, id); 
      } 
     }).setNegativeButton(negativeBtnCaption, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       target.NegativeMethod(dialog, id); 
      } 
     }); 

     AlertDialog alert = builder.create(); 
     alert.setCancelable(isCancelable); 
     alert.show(); 
     if (isCancelable) { 
      alert.setOnCancelListener(new OnCancelListener() { 

       @Override 
       public void onCancel(DialogInterface arg0) { 
        target.NegativeMethod(null, 0); 
       } 
      }); 
     } 
    } 

3)私が見つけた方法を共有して、再利用可能なものを表示してくださいDialogFragment

インターフェイスを使用すると、同じクラスから同じダイアログを複数回再利用したいが、毎回異なるアクションを実行する場合は、面倒です。このソリューションは、問題を回避するために簡単で簡単な方法です。

編集2017年2月25日: この答えは、以前に(確認を実装する抽象クラスを使用していた)と(キャンセル)あなたが使用しようとすると、アンドロイドのが新しいバージョンには、次のエラーでクラッシュしますDialogFragmentとして匿名クラスは:

java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state.

ので、私はJava8で本当に素敵な作品が、それ

なくても実現可能であるランナブルを使用するようにソリューションを変更しました

まず、ダイアログ自体の作成を実装するクラスを作成:

/** 
* Global method to show dialog fragment 
* @param newFragment the DialogFragment you want to show 
*/ 
public void showDialogFragment(DialogFragment newFragment) { 
    // DialogFragment.show() will take care of adding the fragment 
    // in a transaction. We also want to remove any currently showing 
    // dialog, so make our own transaction and take care of that here. 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    // save transaction to the back stack 
    ft.addToBackStack("dialog"); 
    newFragment.show(ft, "dialog"); 
} 

/** 
* This is a reusable convenience class which makes it easy to show a confirmation dialog as a DialogFragment. 
* Create a new instance, call setArgs(...), setConfirm(), and setCancel() then show it via the fragment manager as usual. 
*/ 
public class ConfirmationDialog extends DialogFragment { 
    // Do nothing by default 
    private Runnable mConfirm = new Runnable() { 
     @Override 
     public void run() { 
     } 
    }; 
    // Do nothing by default 
    private Runnable mCancel = new Runnable() { 
     @Override 
     public void run() { 
     } 
    }; 

    public void setArgs(String message) { 
     setArgs("" , message); 
    } 

    public void setArgs(String title, String message) { 
     Bundle args = new Bundle(); 
     args.putString("message", message); 
     args.putString("title", title); 
     setArguments(args); 
    } 

    public void setConfirm(Runnable confirm) { 
     mConfirm = confirm; 
    } 

    public void setCancel(Runnable cancel) { 
     mCancel = cancel; 
    } 

    @Override 
    public MaterialDialog onCreateDialog(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Resources res = getActivity().getResources(); 
     String title = getArguments().getString("title"); 
     return new MaterialDialog.Builder(getActivity()) 
       .title(title.equals("") ? res.getString(R.string.app_name) : title) 
       .content(getArguments().getString("message")) 
       .positiveText(res.getString(R.string.dialog_ok)) 
       .negativeText(res.getString(R.string.dialog_cancel)) 
       .callback(new MaterialDialog.ButtonCallback() { 
        @Override 
        public void onPositive(MaterialDialog dialog) { 
         mConfirm.run(); 
        } 

        @Override 
        public void onNegative(MaterialDialog dialog) { 
         mCancel.run(); 
        } 
       }) 
       .show(); 
    } 
} 

第二に、あなたは、フラグメントマネージャを使用してDialogFragmentを示し、あなたのActivityで一般的な方法をしなければなりません

次に、Activityのどこからでも次のような確認ダイアログを表示できます。

ConfirmationDialog dialog = new ConfirmationDialog(); 
dialog.setArgs(stringDialogTitle, stringDialogMessage); 
Runnable confirm = new Runnable() { 
    @Override 
    public void run() { 
     doStuff(); 
    } 
}; 
dialog.setConfirm(confirm); 
showDialogFragment(dialog); 

Java8を使用している場合は、コードをあまり冗長にしない関数にlambdaを使用できます。例については、hereを参照してください。

関連する問題