Ho studiato questo problema, facendo riferimento ai documenti LayoutInflater e impostando un piccolo progetto dimostrativo di esempio. Le esercitazioni seguenti mostrano come popolare dinamicamente un layout usando LayoutInflater.
Prima di iniziare, guarda quali sono i LayoutInflater.inflate()parametri:
- risorsa : ID per caricare una risorsa di layout XML (ad es.
R.layout.main_page)
- root : vista facoltativa per essere il genitore della gerarchia generata (if
attachToRootis true), oppure semplicemente un oggetto che fornisce un set di LayoutParamsvalori per root della gerarchia restituita (if attachToRootis false.)
attachToRoot : se la gerarchia inflazionata deve essere collegata al parametro root? Se false, root viene utilizzato solo per creare la sottoclasse corretta di LayoutParamsper la vista root nell'XML.
Restituisce : la vista radice della gerarchia gonfiata. Se root è stato fornito ed attachToRootè true, questo è root; altrimenti è la radice del file XML gonfiato.
Ora per il layout e il codice di esempio.
Layout principale ( main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
In questo contenitore è aggiunto un TextView separato, visibile come un piccolo quadrato rosso se i parametri di layout vengono applicati correttamente da XML ( red.xml):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Ora LayoutInflaterviene utilizzato con diverse varianti dei parametri di chiamata
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
I risultati effettivi delle variazioni dei parametri sono documentati nel codice.
SINOSSI: la chiamata LayoutInflatersenza specificare root porta a gonfiare la chiamata ignorando i parametri di layout dall'XML. La chiamata si gonfia con root non è uguale nulle attachRoot=truecarica i parametri di layout, ma restituisce nuovamente l'oggetto root, il che impedisce ulteriori modifiche al layout dell'oggetto caricato (a meno che non sia possibile trovarlo utilizzando findViewById()). La convenzione di chiamata che molto probabilmente vorresti usare è quindi questa:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Per aiutare con problemi di layout, si consiglia vivamente Layout Inspector .