Sto seguendo lo contacts provider lesson on retrieving contacts e li visualizzo utilizzando i frammenti. Come riferimento, ho impostato il livello API su 16 (Android 4.1).getActivity(). FindViewById restituisce null, chiamato dal frammento onActivityCreated
Ho seguito per lo più questo tutorial alla lettera, con alcune eccezioni degne di nota. Ad esempio, importare da mypackage.R
anziché da android.R
.
Il mio problema è nel mio onActivityCreated
gestore nel mio ListContactsFragment
:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Initializes the loader
getLoaderManager().initLoader(0, null, this);
// Gets the ListView from the View list of the parent activity
View mContactsListView =
getActivity().findViewById(R.layout.contacts_list_view);
mContactsList = (ListView) mContactsListView;
// Gets a CursorAdapter
mCursorAdapter = new SimpleCursorAdapter(
getActivity(),
R.layout.contacts_list_item,
null,
FROM_COLUMNS, TO_IDS,
0);
// Sets the adapter for the ListView
mContactsList.setAdapter(mCursorAdapter);
// Set the item click listener to be the current fragment.
mContactsList.setOnItemClickListener(this);
}
View mContactsListView
è nullo, il che significa findViewById
non ha funzionato.
L'attività padre è una predefinita creata da eclipse. Per questo, ho fatto due cose:
- sostituito
import android.app.Activity
conandroid.support.v4.app.FragmentActivity
per evitare che ilClasscastException
che succede se non lo fai. - Importato il mio frammento nell'XML.
mio activity_list_contacts.xml
assomiglia a questo:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ListContactsActivity" >
<fragment android:name="mypackage.ListContactsFragment"
android:id="@+id/contacts_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
l'attività di corrispondenza, nel caso in cui:
public class ListContactsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_contacts);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.list_contacts, menu);
return true;
}
}
e contacts_list_view.xml
:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Quindi la mia domanda è, cosa sto sbagliando per findViewById
non trovare la mia vista?
Le cose che ho provato (la maggior parte di questi sono accettati risposte alle domande che quasi sembrano un duplicato a questo):
- lettura del documento ho copiato e incollato dalla parola per parola.
- Provare a
getView().findViewById()
come suggerito in this question. Anche questo restituisce null. - utilizzando
findViewById(R.id.contacts_list_view);
come suggerito da this answer. Questo non restituisce nulla; invece provoca unoClassCastException
in cuiandroid.support.v4.app.NoSaveStateFrameLayout
non può essere trasmesso aandroid.widget.ListView
. Ho letto che a volte il callback del frammento per la creazione si verifica prima di essere collegato all'attività. Così, ho aggiunto il gestore per il metodo
onAttach
in questo modo:@Override public void onAttach(Activity activity) { super.onAttach(activity); View mContactsListView = activity.findViewById(R.id.contacts_list_view); mContactsList = (ListView) mContactsListView; // Gets a CursorAdapter mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contacts_list_item, null, FROM_COLUMNS, TO_IDS, 0); // Sets the adapter for the ListView mContactsList.setAdapter(mCursorAdapter); // Set the item click listener to be the current fragment. mContactsList.setOnItemClickListener(this); }
avete indovinato - ancora nulla.
Quindi a questo punto sono un po 'perso. Ho due domande:
- Che cosa sto facendo di sbagliato (si prega di richiedere ulteriori informazioni nei commenti se non ho fornito abbastanza)?
- È preferibile lasciare la configurazione dell'adattatore in
onAttach
o dove dice il tutorial.
Se si utilizza un ID dal framework Android, dovrebbe essere utilizzato come 'android.R.id. *'. 'TO_IDS' è definito come' private final static int [] TO_IDS = {android.R.id.text1} '? – Vikram
@vikram sì, è un membro della classe dei frammenti. –