2012-01-11 15 views
2

私は自分の共有ダイアログを開くための非常に簡単なアプリケーションを書いています。 XMLレイアウトは1つだけのボタンが含まれます。Androidのダイアログがデバイスを回転させた後に再び開く

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@color/white" 
    android:gravity="center_horizontal"> 

    <Button android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:layout_margin="20dip" 
     android:text="Click here to open Share Dialog" 
     android:onClick="onBtnShareClick"/> 

</LinearLayout> 

そして活動には、ボタンをクリックすると、私はダイアログ

public class CustomDialog extends Activity { 

    private static final int SHOW_DIALOG_SHARE = 1; 
    private ArrayAdapter<ShareItem> mShareAdapter; 

    @Override 
    protected void onCreate(Bundle savedState) { 
     super.onCreate(savedState); 

     setContentView(R.layout.custom_dialog); 

     final ShareItem[] items = { 
      //new Item("Menu item", R.drawable.icon_assistance), 
      new ShareItem("Banbe", R.drawable.ic_banbe), 
      new ShareItem("Facebook", R.drawable.ic_facebook), 
      new ShareItem("Twitter", R.drawable.ic_twitter), 
      new ShareItem("Gmail", R.drawable.ic_gmail), 
      new ShareItem("Other sharing options...", 0) 
     }; 

     mShareAdapter = new ArrayAdapter<ShareItem>(
     this, 
     android.R.layout.select_dialog_item, 
     android.R.id.text1, 
     items){ 
      public View getView(int position, View convertView, ViewGroup parent) { 
       //User super class to create the View 
       View v = super.getView(position, convertView, parent); 
       TextView tv = (TextView)v.findViewById(android.R.id.text1); 

       //Put the image on the TextView 
       tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0); 

       //Add margin between image and text (support various screen densities) 
       int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f); 
       tv.setCompoundDrawablePadding(dp5); 

       return v; 
      } 
     }; 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
      case SHOW_DIALOG_SHARE: 
      return new AlertDialog.Builder(this) 
      .setIcon(R.drawable.icon) 
      .setTitle(R.string.app_name) 
      .setAdapter(mShareAdapter, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        Toast.makeText(CustomDialog.this, "Click on item " + item, Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .show(); 
     } 
     return null; 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     // TODO Auto-generated method stub 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    public void onBtnShareClick(View v) { 
     showDialog(SHOW_DIALOG_SHARE); 
    } 

    protected class ShareItem { 
     public final String text; 
     public final int icon; 
     public ShareItem(String text, Integer icon) { 
      this.text = text; 
      this.icon = icon; 
     } 
     @Override 
     public String toString() { 
      return text; 
     } 
    } 

} 

を共有カスタムを作成し、私の共有ダイアログが開かれます。すべての良い。

ここで、デバイスをポートレートモードにして、ボタンをクリックしてダイアログを開きます。その後、戻るを押して[共有ダイアログ]を閉じます。 デバイスを横向きモードに回転します。私はボタンをクリックしなかったが、突然共有ダイアログが再開された。

ネイティブの共有ダイアログを使用しようとすると、私はこのバグは表示されません。たぶんカスタム共有ダイアログが原因でしょうか?

ここで何が間違っているのか教えていただけますか?

答えて

4

こんにちは、アプリケーションマニフェストファイルに画面の向きのサポートを追加する必要があります。

<activity android:name=".TestApp" 
    android:label="@string/app_name" android:configChanges="orientation"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

し、また、次のメソッドをオーバーライドし、

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    } 
+0

これは機能します。すばらしいです。しかし、configChanges = "orientation"を追加する代わりに、それを修正する別の方法がありますか?私はここにconfigChangesを追加したくないからです。 – anticafe

+0

私はやりたいと思っていません... – sivakg2000

+0

私と一緒に働いていません –

0

使用)は、(代わりにshow()メソッドのメソッドを作成

新しいAlertDialog.Builder(この).create()

0

DialogまたはAlertDialogが使用されているかどうかは関係ありません。あなたは、画面を回転させたときに、ダイアログを閉じないようにするためには、このコードを使用します。

public class QuestionDialogFragment extends DialogFragment 
    { 
     public final static String BF_TITLE = "QuestionDialogFragment.BF_TITLE"; 
     public final static String BF_QUESTION = "QuestionDialogFragment.BF_QUESTION"; 

     private Callback mCallback; 

     public static void init(FragmentManager fragmentManager, String title, String question, Callback callback) 
     { 
      Bundle bundle = new Bundle(); 
      bundle.putString(BF_TITLE, title); 
      bundle.putString(BF_QUESTION, question); 

      QuestionDialogFragment dialog = new QuestionDialogFragment(); 
      dialog.setCallbackListener(callback); 
      dialog.setArguments(bundle); 
      dialog.show(fragmentManager, null); 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 

      setCancelable(false); 
     } 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) 
     { 
      Bundle bundle = getArguments(); 

      String title = null; 
      String question = null; 

      if (bundle != null) 
      { 
       if (bundle.containsKey(BF_TITLE)) 
       { 
        title = bundle.getString(BF_TITLE); 
       } 
       if (bundle.containsKey(BF_QUESTION)) 
       { 
        question = bundle.getString(BF_QUESTION); 
       } 
      } 

      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()); 
      alertDialogBuilder.setTitle(title); 
      alertDialogBuilder.setMessage(question); 
      //null should be your on click listener 
      alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        mCallback.success(); 
        dialog.dismiss(); 
       } 
      }); 
      alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
      { 

       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        mCallback.cancel(); 
        dialog.cancel(); 
       } 
      }); 

      return alertDialogBuilder.create(); 
     } 

     public void setCallbackListener(Callback callback) 
     { 
      this.mCallback = callback; 
     } 

     public static interface Callback 
     { 
      void success(); 
      void cancel(); 
     } 
} 

そして、それを使用します。

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
+0

私のために働いていません。 – Gadzair

+0

しばらくすると、このオプションが意味をなさないことに気付きました。 [DialogFragment](http://developer.android.com/reference/android/app/DialogFragment.html)を使う方が効率的です。あなたはそれを簡単にカスタマイズすることができ、回転画面中に状態を保存できるので。 – cosic

+0

[上](http://stackoverflow.com/a/21902774/1852397)を参照してください、有用だったかもしれません。 – cosic

0

は、例えばDialogFragment

から延びているだろう自分のクラスを使用して試してみてくださいあなたのコードのどこにでも:

  QuestionDialogFragment.init(
       getFragmentManager(), 
       "Some title", 
       "Some question?", 
       new QuestionDialogFragment.Callback() 
       { 
        @Override 
        public void success() 
        { 
         // @TODO if user choice YES; 
        } 

        @Override 
        public void cancel() 
        { 
         // @TODO if user choice CANCEL; 
        } 
       }); 

スタンドだけではなく、ダイアログウィンドウをRD:

Dialog onCreateDialog(Bundle savedInstanceState) 

使用たとえば

View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

は値/レイアウト/ your_fragment_layoutを作成する必要があります。XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/kom_purchase_dialog_root_view"> 

     <TextView 
      android:id="@+id/kom_purchase_dialog_message_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="some text"/> 

     <LinearLayout 
      android:layout_gravity="bottom" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <Button 
       android:id="@+id/kom_purchase_dialog_negative_button" 
       android:layout_alignParentBottom="true" 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content" 
       android:text="Cancel"/> 

      <Button 
       android:id="@+id/kom_purchase_dialog_positive_button" 
       android:layout_toRightOf="@+id/kom_purchase_dialog_negative_button" 
       android:layout_alignParentBottom="true" 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content" 
       android:text="Ok"/> 
     </LinearLayout> 
    </FrameLayout> 

とこのレイアウトの場合と同様に独自のクラスを変更します。

public class QuestionDialogFragment2 extends DialogFragment 
{ 

    public final static String BF_TITLE = "QuestionDialogFragment.BF_TITLE"; 
    public final static String BF_QUESTION = "QuestionDialogFragment.BF_QUESTION"; 

    private Callback mCallback; 

    public static void init(FragmentManager fragmentManager, String title, String question, Callback callback) 
    { 
     Bundle bundle = new Bundle(); 
     bundle.putString(BF_TITLE, title); 
     bundle.putString(BF_QUESTION, question); 

     QuestionDialogFragment2 dialog = new QuestionDialogFragment2(); 
     dialog.setCallbackListener(callback); 
     dialog.setArguments(bundle); 
     dialog.show(fragmentManager, null); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setCancelable(false); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     Bundle bundle = getArguments(); 

     String title = null; 
     String question = null; 

     if (bundle != null) 
     { 
      if (bundle.containsKey(BF_TITLE)) 
      { 
       title = bundle.getString(BF_TITLE); 
      } 
      if (bundle.containsKey(BF_QUESTION)) 
      { 
       question = bundle.getString(BF_QUESTION); 
      } 
     } 
     View view = super.onCreateView(inflater, container, savedInstanceState); 
     if (view == null) 
     { 
      view = inflater.inflate(R.layout.your_fragment_layout, null, false); 
      view.setTag(new Holder(view)); 
     } 
     Holder holder = (Holder) view.getTag(); 
     holder.messageTextView.setText(question); 
     holder.positiveButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       mCallback.success(); 
      } 
     }); 
     holder.negativeButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       mCallback.cancel(); 
      } 
     }); 
     return view; 
    } 

    public void setCallbackListener(Callback callback) 
    { 
     this.mCallback = callback; 
    } 

    public static interface Callback 
    { 
     void success(); 
     void cancel(); 
    } 

    private final class Holder 
    { 
     public TextView messageTextView; 
     public Button positiveButton; 
     public Button negativeButton; 

     private Holder(View view) 
     { 
      messageTextView = (TextView) view.findViewById(R.id.question_dialogfragment_message_textview); 
      positiveButton = (Button) view.findViewById(R.id.question_dialogfragment_positive_button); 
      negativeButton = (Button) view.findViewById(R.id.question_dialogfragment_negative_button); 
     } 
    } 
} 

と同じ用法:両方のアプローチについては

  QuestionDialogFragment2.init(
       getFragmentManager(), 
       "Some title", 
       "Some question?", 
       new QuestionDialogFragment2.Callback() 
       { 
        @Override 
        public void success() 
        { 
         // @TODO if user choice YES; 
        } 

        @Override 
        public void cancel() 
        { 
         // @TODO if user choice CANCEL; 
        } 
       }); 

は無効onSaveInstanceState(バンドルoutState)が動作し、回転後に状態を保存します。私はそれがより簡単で普遍的なアプローチだと思うユーザーは、簡単なダイアログ。

関連する問題