play para modo juegos instalar habilitar google descargar desarrollador como chrome apps activar activa android dialog rotation screen-rotation

android - para - instalar windows en chromebook



Diálogo de Android vuelve a abrir después de rotar el dispositivo (4)

Hola. Debes agregar soporte de orientación de pantalla en el archivo de manifiesto de tu aplicación.

<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>

Y también anula el siguiente método,

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

Estoy escribiendo una aplicación muy simple para abrir mi diálogo de compartir personalizado. El diseño XML contiene solo 1 botón:

<?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>

Y en Activity, creo un diálogo de uso compartido personalizado

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; } } }

Cuando haga clic en el botón, se abrirá mi cuadro de diálogo Compartir. Todo bien.

Ahora, giro el dispositivo al modo vertical, hago clic en el botón para abrir el cuadro de diálogo. Después de eso, presione hacia atrás para cerrar el cuadro de diálogo Compartir. Gire el dispositivo al modo horizontal . De repente, el cuadro de diálogo Compartir se vuelve a abrir, aunque no hice clic en el botón.

Cuando intento utilizar el diálogo de intercambio nativo, no veo este error. Tal vez un diálogo de intercambio personalizado es la causa?

¿Alguien puede decirme qué pasa aquí?


Intenta usar una clase propia que se ampliará desde DialogFragment

Por ejemplo:

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(); } }

Y úsala en cualquier parte de tu código:

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; } });

Si desea crear una vista propia en lugar de una ventana de diálogo estándar solo en su lugar:

Dialog onCreateDialog(Bundle savedInstanceState)

utilizar

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

Por ejemplo:

necesita crear valores / diseño / 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>

y para este diseño cambie su propia clase como:

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); } } }

y el mismo uso:

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; } });

Para ambos enfoques funcionará nulo en SaveInstanceState (Bundle outState) y guardará el estado después de la rotación. Creo que es mejor y el enfoque universal, entonces el usuario el diálogo simple.


No importa si se utilizó Dialog o AlertDialog. Para evitar cerrar el diálogo cuando gira la pantalla, use este código:

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


use el método create () en lugar del método show ()

nuevo AlertDialog.Builder (this) .create ()