Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Fragmento de fragmento de Android como fragmento de diálogo o fragmento habitual

Lo que estoy tratando de lograr es tener un fragmento que en la tableta se muestra como un DialogFragment , mientras que en el teléfono inteligente que se muestra como un fragmento regular. Soy consciente de que ya hay un post similar , pero no soy capaz de hacer que el trabajo – aplicar el estilo de fragmento.

Para mostrar las cosas de arriba abajo, MainActivity.java:

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_next) { decideToNext(); return true; } return super.onOptionsItemSelected(item); } private void decideToNext() { String device = getString(R.string.device); if ("normal".equalsIgnoreCase(device)) { Intent intent = new Intent(this, DetailedActivity.class); startActivity(intent); } else if ("large".equalsIgnoreCase(device)) { Log.d("SOME_TAG", "Yes, I am seeing this line on tablet only"); DetailedFragment fragment = DetailedFragment.newInstance(); getSupportFragmentManager().beginTransaction().add(fragment, "MAGIC_TAG").commit(); } } } 

DetailedActivity no es nada mucho:

 public class DetailedActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.detailed_activity); } } 

Su diseño:

 <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_container" android:name="com.myapps.sampleandroid.DetailedFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Y el interesante DetailedFragment :

 public class DetailedFragment extends Fragment { public static DetailedFragment newInstance() { return new DetailedFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.MyDialogTheme); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); return localInflater.inflate(R.layout.detailed_fragment, container, false); } } 

… y su diseño:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Regular Text" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button Dummy" /> </LinearLayout> 

En onCreateView he intentado establecer el estilo personalizado, pero no parece funcionar para la tableta.

Estilización

Res / values ​​/ styles.xml contiene:

 <resources> <style name="AppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> </style> <style name="MyDialogTheme" /> </resources> 

Mientras res / values-large / styles.xml:

 <resources> <!-- Is there anything I should add here? --> <style name="MyDialogTheme" parent="@android:style/Theme.Dialog"/> </resources> 

He anidado MyDialogTheme de Theme.Dialog , pero no parece ayudar.

En el teléfono inteligente al pulsar en el elemento de menú de la barra de acción "SIGUIENTE" veo la actividad detallada (instantánea desde un SG2): Instantánea de un SG2

Mientras que pulsa en el mismo "NEXT" elemento de menú de la tableta no hace nada (excepto ver el mensaje en Logcat: Yes, I am seeing this line ). Introduzca aquí la descripción de la imagen

¿Qué debo agregar más en styles.xml o en el código para ver DetailedFragment como un cuadro de diálogo para la tableta?

EDITAR

He intentado la solución Little Child propuesta (para tener un DialogFragment contienen mi fragmento inicial y mostrarlo). Por lo tanto, he añadido un WrapperDetailedFragment :

 public class WraperDetailedFragment extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.wrap_detailed_fragment, container, false); } } 

Su diseño:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_container_dialog" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:id="@+id/wrapped_fragment_id" android:layout_width="match_parent" android:layout_height="match_parent" class="com.myapps.sampleandroid.DetailedFragment" /> </LinearLayout> 

El código de MainActivity cambia a:

 private void decideToNext() { String device = getString(R.string.device); if ("normal".equalsIgnoreCase(device)) { Intent intent = new Intent(this, DetailedActivity.class); startActivity(intent); } else if ("large".equalsIgnoreCase(device)) { Log.d("SOME_TAG", "Yes, I am seeing this line ..."); WraperDetailedFragment fragment = new WraperDetailedFragment(); fragment.show(getSupportFragmentManager(), "MAGICAL_TAG"); } } 

Pero cuando intento agregar este DialogFragment estoy consiguiendo el choque siguiente:

 android.view.InflateException: Binary XML file line #8: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at com.myapps.sampleandroid.WraperDetailedFragment.onCreateView(WraperDetailedFragment.java:12) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:304) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at com.myapps.sampleandroid.WraperDetailedFragment.onCreateView(WraperDetailedFragment.java:12) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f050047, tag null, or parent id 0x0 with another fragment for com.myapps.sampleandroid.DetailedFragment at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:290) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) ... 28 more 

  • Uso de ImageMagick en mi aplicación Android
  • Convertir texto a mapa de bits (Pixel) en Android
  • Android GoogleAPIClient - NoClassDefFoundError: com / google / android / gms / interno / zzsa
  • Creación de vínculos duros y enlaces simbólicos en Android
  • Error: Error de ejecución para la tarea ': app: mergeDebugResources'. > Se ha producido un error en el procesamiento de archivos, vea los registros para obtener detalles.
  • Problemas parcelables al ofuscar con Proguard
  • No se puede resolver el símbolo c882c94be45fff9d16a1cf845fc16ec5
  • ArrayIndexOutOfBoundsException cuando se utiliza ListAdapter
  • 3 Solutions collect form web for “Fragmento de fragmento de Android como fragmento de diálogo o fragmento habitual”

    Este problema se puede arreglar fácilmente si en vez de intentar hacer que un Fragment parezca un DialogFragment me gustaría mirar desde el ángulo opuesto: hacer un aspecto DialogFragment como un Fragment – después de todo, un DialogFragment es un Fragment !

    La clave de esta corrección es llamar o no DialogFragment.setShowsDialog();

    Cambiando así el DetailedFragment a:

     public class DetailedFragment extends DialogFragment { private static final String ARG_SHOW_AS_DIALOG = "DetailedFragment.ARG_SHOW_AS_DIALOG"; public static DetailedFragment newInstance(boolean showAsDialog) { DetailedFragment fragment = new DetailedFragment(); Bundle args = new Bundle(); args.putBoolean(ARG_SHOW_AS_DIALOG, showAsDialog); fragment.setArguments(args); return fragment; } public static DetailedFragment newInstance() { return newInstance(true); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); if (args != null) { setShowsDialog(args.getBoolean(ARG_SHOW_AS_DIALOG, true)); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.detailed_fragment, container, false); } } 

    Su disposición permanece como estaba, DetailedActivity cambia a:

     public class DetailedActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.detailed_activity); if (savedInstanceState == null) { DetailedFragment fragment = DetailedFragment.newInstance(false); getSupportFragmentManager().beginTransaction().add(R.id.root_layout_details, fragment, "Some_tag").commit(); } } } 

    Su disposición también:

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

    Y la actividad del llamante sólo:

     private void decideToNext() { String device = getString(R.string.device); if ("normal".equalsIgnoreCase(device)) { Intent intent = new Intent(this, DetailedActivity.class); startActivity(intent); } else if ("large".equalsIgnoreCase(device)) { DetailedFragment fragment = DetailedFragment.newInstance(); fragment.show(getSupportFragmentManager(), "Tablet_specific"); } } 

    OK, he estado allí y hecho eso. Para crear un DialogFragment se necesita un diseño definido en XML. Digamos, para esto tienes LinearLayout como root. En este LinearLayout puedes agregar un fragment class="...." y cuando DialogFragment tu DialogFragment , será el mismo Fragment que mostraras lado a lado en la tableta que ahora se muestra en un DialogFragment .

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment class="com.example.tqafragments.FeedFragment" android:id="@+id/feedFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout> 

    Al igual que. Y infla esto en tu DialogFragment

    Para hacer que un DialogFragment muestre como un Fragment regular, llame a add() o replace() utilizando un ID de recurso para el contenedor de fragmentos, por ejemplo

     beginTransaction().add(R.id.fragment_container, fragment) 

    Pero para que el DialogFragment se muestre como un diálogo, llama add(fragment, "Fragment Tag") . Detrás de las escenas esto resulta en una llamada a add(resId, fragment) , estableciendo el ID de recurso para el contenedor de fragmentos en 0, lo que hace que DialogFragment defina su opción showAsDialog como true.

    Como consecuencia, puede utilizar un fragmento de diálogo como un diálogo o un fragmento regular, dependiendo de sus necesidades, sin necesidad de crear ninguna lógica especial para hacerlo.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.