2012-07-10 8 views
18

Acabo de echar un vistazo a la plantilla Master/Detail Flow y no puedo entender dos cosas.Dos preguntas acerca de la plantilla de flujo maestro/detalle

1) ¿Por qué requiere Android versión 11 cuando el código que genera parece utilizar el soporte de compatibilidad de Fragment? En particular, ¿por qué no puedes generar plantillas que se ejecuten en la versión 8 de Android? (Por ejemplo, esta importación)

import android.support.v4.app.FragmentActivity; 

2) ¿Cómo funciona la actividad principal de saber si desea mostrar los datos en una nueva actividad o en el panel de detalles si es lo suficientemente grande? Parece que hacerlo a través de este código:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_item_list); 

    if (findViewById(R.id.item_detail_container) != null) { 
     mTwoPane = true; 
     ((ItemListFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.item_list)) 
       .setActivateOnItemClick(true); 
    } 
} 

setContentView(R.layout.activity_item_list); establece el diseño de un ListFragment que acaba establece su propio adaptador, pero no puedo ver cómo se findViewById(R.id.item_detail_container) != null vez de vuelta verdad ya que nunca parece estar abierto/inflado .

¿Alguna pista?

+0

Para ser capaz de llamar a la API fragmento, su objetivo debe ser api 11. –

+0

pero no son fragmentos como tales. Su importación se realiza a través de android.support.v4.app.ListFragment; en lugar de android.app.Fragment Así que son Fragmentos de compatibilidad que deberían ser accesibles desde 1.6 –

+0

Supongo que se hace para permitir que la aplicación se ejecute tanto en api4 como en api11. Con api 11 de destino aún puede ejecutar la aplicación en api4 –

Respuesta

14

después de buscar mucho, la respuesta es debido a esto en values-large/refs.xml

<resources> 
    <item type="layout" name="activity_item_list">@layout/activity_item_twopane</item> 
</resources> 

Se redirige la solicitud de la distribución normal a un diseño más grande (la versión de dos paneles), donde se define R.id.item_detail_container.

Esto es bastante ofuscado. No estoy seguro de por qué no llamaron al diseño grande igual que el diseño normal, pero luego tienen diferentes xml.

+0

Gracias por esto, también he tenido curiosidad sobre esto. He intentado encontrar documentación que describa las plantillas y cómo funcionan, pero no he podido encontrar ninguna. ¿Sabes si existe tal documentación? – span

+0

No conozco ninguno. Lo siento :) –

+0

Gracias de todos modos :) – span

0

Creo que la plantilla Master/Detail Flow requiere el nivel api 11 porque utiliza la barra de acciones. Trataré de usar esta plantilla con ActionBarSherlcock y veré si funciona con Android 2.2 o 2.3.

2

con respecto a su primera pregunta:

usted necesita el cambio en la clase ItemListFragment:

esto:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(), 
       R.layout.simple_list_item_activated_1, 
       R.id.text1, 
       DummyContent.ITEMS)); 

para esto:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(), 
       R.layout.simple_list_item_1, 
       R.id.text1, 
       DummyContent.ITEMS)); 

y comentar en ItemDetailActivity esta línea:

// getActionBar().setDisplayHomeAsUpEnabled(true); 
+0

¡Usted señor, es asombroso! Aunque también podría extender desde 'ActionBarActivity' y cambiar a' getSupportActionBar(). SetDisplayHomeAsUpEnabled (true); ' en lugar de comentarlo. –

0

En cuanto a la primera pregunta, una de las razones por las que requiere V11 es que está utilizando list_content, y eso no está incluido en la biblioteca de compatibilidad. Una solución para eso es here.

0

La técnica utilizada en la segunda parte de su pregunta es un ejemplo de Layout Alias.

13

Esto es lo que funcionó para mí.

1) Agregue ActionBarSherlock al proyecto: Proyecto -> Propiedades -> Android -> Seleccione ActionBarSherlock y presione el botón "Agregar". Si no tiene ABS, bueno, necesita obtenerlo de http://actionbarsherlock.com/ antes de continuar.

2) "AndroidManifest.xml": Establezca minSdkVersion en 10 (Gingerbread). Creo que puedes ir aún más bajo que eso.

android:minSdkVersion="10" 

3) "activity_item_list.xml": Basta con retirar "list_content", porque Eclipse mantiene quejándose que necesita de nido de abeja o posterior.

tools:layout="@android:layout/list_content" <-- remove 

4) "activity_item_twopane.xml": Retire las líneas de Honeycomb-or-later.

android:divider="?android:attr/dividerHorizontal" <-- remove 
tools:layout="@android:layout/list_content"  <-- remove 

5) ItemListActivity.java: Use SherlockFragmentActivity.

//public class ItemListActivity extends FragmentActivity implements 
public class ItemListActivity extends SherlockFragmentActivity implements 

6) ItemListFragment.java: Modificar parámetros para setListAdapter().

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

    // TODO: replace with a real list adapter. 
     //setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(), 
     // android.R.layout.simple_list_item_activated_1, 
     // android.R.id.text1, DummyContent.ITEMS)); 

     int layout = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ? 
      android.R.layout.simple_list_item_activated_1 : 
      android.R.layout.simple_list_item_checked; 

     setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(), 
      layout, DummyContent.ITEMS)); 
} 

7) "ItemDetailActivity.java": Uso SherlockFragmentActivity y getSupportActionBar().

//public class ItemDetailActivity extends FragmentActivity { 
public class ItemDetailActivity extends SherlockFragmentActivity { 
    ... 
    //getActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Después de realizar los cambios, la aplicación funcionó en Gingerbread, ICS y Jelly Bean.

__ sol

+0

¡Fantástico! Exactamente lo que estaba buscando, funciona para api 8 – jamesc

+0

Había establecido en min api 8 en mi manifest.xml, todavía no podía ejecutarlo en el emulador ver2.2 y 2.3, ¿qué me falta? – Eric

+0

me salvaste al menos un par de horas. No entiendo por qué las excepciones de Android son no descriptivas. todo lo que obtuve fue la excepción de puntero nulo en el inflado final – Sergi0

Cuestiones relacionadas