3

Je tente de créer un ListView personnalisé. Quand je teste mon code, je reçois l'erreur suivanteAucune vue trouvée pour id dans Android FragmentActivity avec ListFragment

03-09 19:21:10.425: E/AndroidRuntime(379): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.anomaly.punchlist/com.anomaly.punchlist.TeamActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f08000c for fragment TeamListFragment{4067a358 #0 id=0x7f08000c} 

J'ai référencé les liens suivants avant de poster cette question, en plus de la lecture des docs Android sur Fragments, ListFragments et listviews.

Lien 1: FragmentActivity onCreateView
Lien 2: Problem using ListFragment on Android
Link 3: Android Fragment no view found for ID?
Link 4: Android ListFragment is to confusing
Lien 5: How update ListView in ListFragment from FragmentActivity?
Lien 6: Populate ListFragments with a custom view?

Je classe TeamActivity qui étend FragmentActivity et Te amListFragment qui étend ListFragment et implémente LoaderManager.LoaderCallbacks. S'il vous plaît voir le code ci-dessous:

TeamActivity.java

package com.anomaly.punchlist; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 

public class TeamActivity extends FragmentActivity { 

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

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    TeamListFragment teamListFragment = new TeamListFragment(); 
    fragmentTransaction.add(R.id.android_teamList, teamListFragment); 
    fragmentTransaction.commit();  
    } 

} 

TeamListFragment.java

package com.anomaly.punchlist; 

    import android.database.Cursor; 
    import android.os.Bundle; 
    import android.support.v4.app.ListFragment; 
    import android.support.v4.app.LoaderManager; 
    import android.support.v4.content.CursorLoader; 
    import android.support.v4.content.Loader; 
import android.support.v4.widget.CursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import com.anomaly.punchlist.contentprovider.basecolumns.TeamBaseColumns.Team; 
import com.j256.ormlite.logger.Logger; 
import com.j256.ormlite.logger.LoggerFactory; 

public class TeamListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static Logger logger = LoggerFactory.getLogger(TeamListFragment.class); 
    private ListView listView; 
    private SimpleCursorAdapter adapter; 
    private static final int TEAM_LOADER_ACTIVITY = 0x01; 
    private static final String[] PROJECTION = new String[] { "project_manager_id", "contact_id", "project_id" }; 
    private static String SELECTION = "contact_id = ? AND project_id = ?"; 

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     try { 
      super.onCreate(savedInstanceState); 
      int[] uiBindTo = { R.id.text1 }; 
      getLoaderManager().initLoader(TEAM_LOADER_ACTIVITY, null, this); 
      adapter = new SimpleCursorAdapter(getActivity().getApplicationContext(), R.layout.team, null, null, uiBindTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     } catch (Exception e) { 
      logger.error(e.getMessage()); 
      new RuntimeException("RuntimeException occurred in onCreate() method of TeamActivity." + e); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle bundle) { 

     String contactId = new String(); 
     String projectId = new String(); 
     CursorLoader cursorLoader = null; 

     if (bundle != null) { 
      contactId = bundle.getString("contact_id"); 
      projectId = bundle.getString("project_id"); 

     } 
     String[] selectionArgs = { contactId + ", " + projectId }; 
     cursorLoader = new CursorLoader(getActivity(), Team.CONTENT_URI, PROJECTION, SELECTION, null, null); 
     return cursorLoader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     adapter.swapCursor(cursor); 
     setListShown(true); 

    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursor) { 
     adapter.swapCursor(null); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     onCreate(savedInstanceState); 
     View teamView = inflater.inflate(R.layout.team, container, false); 
     return teamView; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     listView = getListView(); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     setListAdapter(adapter); 
     setListShown(true); 
    } 

} 

En plus du code ci-dessus, je la mise en page personnalisée suivante.

team.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" > 


    <ListView 
     android:id="@+id/android:teamList" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="@color/grey2" 
     android:divider="@color/blue2" 
     android:dividerHeight="1dp" 
     android:drawSelectorOnTop="false" /> 

    <TextView 
     android:id="@id/android:empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FF0000" 
     android:text="No data" /> 
</LinearLayout> 
+1

Qu'est-ce que cet ID 0x7f08000c? Vous pouvez trouver cette réponse dans votre fichier gen/ /R.java. – Hartok

+0

@ Hartok: Il est référencé dans une mise en page xml appel team_row.xml qui a un TextView l'identifiant android qui est égal à text1. 0x7f08000c = text1. – dionysus

+0

@Hartok: Merci encore pour l'aide. Cependant, je mets l'id référencé dans mon fichier team.xml et maintenant je reçois ce qui suit Causé par: java.lang.IllegalArgumentException: Aucune vue trouvée pour l'ID 0x7f08000c pour le fragment TeamListFragment {4065f128 # 0 id = 0x7f08000c} – dionysus

Répondre

5

Dans onCreate() méthode de votre Activité utiliser la méthode setContentView(R.layout.activity) et définir également un fichier de mise en page, qui contient un FrameLayout intérieur LinearLayout.

Maintenant invoquer add() méthode avec l'id de FrameLayout vous venez d'ajouter au lieu de R.id.android_teamList que vous utilisez dans votre onCreate() et également remplacer android:id="@+id/android:teamList" avec android:id="@android:id/list" dans votre fichier de mise en page de team.xml. Au fait, si vous le souhaitez, vous pouvez accéder à votre ListView avec android.R.id.list.

+0

Merci pour l'aide. Cependant, comment puis-je récupérer ceci dans fragmentTransaction.add (R.id.listView1, teamListFragment); ? – dionysus

+1

Attendez une seconde ... quelque chose d'autre est faux aussi ... mettre à jour ma réponse. –

+0

Pourquoi ai-je besoin de créer un autre fichier de mise en page? Le fichier de mise en page team.xml ne devrait-il pas suffire? – dionysus

1

R.id.text1 devrait être définie dans R.layout.team.

Vérifiez la SimpleCursorAdapter doc:

identifiant de ressource d'un fichier de configuration qui définit les vues pour cet élément de liste . Le fichier de disposition doit inclure au moins les vues nommées défini dans "to"

+0

Merci pour toute l'aide. Mais il y a une autre partie supplémentaire à faire fonctionner tout cela en raison d'un bug dans la bibliothèque de compatibilité v4 ListFragment utilise l'ID interne pour TextView 'vide'. Voir [Bogue de compatibilité] (https://code.google.com/p/android/issues/detail?id=21742) et [Solution] (http://stackoverflow.com/questions/10608624/list-fragment-does -not-accept-my-layout) pour plus d'informations. – dionysus

Questions connexes