0

J'essaie d'obtenir un identifiant de vue de liste à partir d'un autre fichier xml (fragment_friends.xml) pendant que je suis dans la présentation activity_main.xml. J'ai essayé 2 manières, mais elles ne fonctionnent pas correctement.Comment utiliser inflater pour obtenir une vue de liste à partir d'un fragment dans Android Studio

Ci-dessous le code provoquera l'application plantage tout de suite parce que je suis en train d'obtenir une carte d'identité qui n'existe pas dans cette mise en page (activity_main)

code original

ListView friendList = (ListView) findViewById(R.id.friend_listView); 
    friendList.setAdapter(friendAdaptor); 

Ci-dessous le code approprié, mais Je ne serai pas en mesure d'insérer ou d'afficher des données dans ma base de données.

Essayez 1 code:

View inflatedView = getLayoutInflater().inflate(R.layout.fragment_friend, null); 
    ListView friendList = (ListView) inflatedView.findViewById(R.id.friend_listView); 
    friendList.setAdapter(friendAdaptor); 

Ci-dessous le code la base de données et de travaux LISTVIEW, mais mon tiroir navbar est parti et moi quand je tente de revenir à activity_main, app plante

Essayez 2 Code

setContentView(R.layout.fragment_friend); 
    ListView friendList = (ListView) inflatedView.findViewById(R.id.friend_listView); 
    friendList.setAdapter(friendAdaptor); 

app_bar_main.xml

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <!--<include layout="@layout/content_main" />--> 
    <FrameLayout 
     android:id="@+id/flContent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize"/> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     app:srcCompat="@android:drawable/ic_dialog_email" /> 

</android.support.design.widget.CoordinatorLayout> 
+0

Je vais supprimer ma réponse originale et en fournir une nouvelle qui, je l'espère, aborde tout ce qui se passe ici. –

+0

D'accord, j'ai aussi mis à jour le code pour app_bar main – mmm

Répondre

0

Je crois que la racine de votre problème se résume à un manque de familiarité avec les API Android Fragment générales. C'est très bien; tout le monde est nouveau quand ils commencent. Mais cela signifie que votre question est assez difficile à répondre avec concision (au-delà de "lire sur les Fragments").

Vous devriez, bien sûr, commencer par la lecture sur Fragments: https://developer.android.com/guide/components/fragments.html

Pourtant, je pense que nous pouvons couvrir les choses ici en bref.

Tous les fragments doivent être hébergés dans une activité. La méthode normale consiste à ajouter une balise <fragment> à la mise en page xml de votre activité ou à inclure <FrameLayout> dans la mise en page xml de votre activité puis en utilisant un FragmentTransaction pour ajouter/remplacer/supprimer dynamiquement des fragments de cette image.

Dans votre code affiché, à l'intérieur app_bar_main.xml, je vois ceci:

<FrameLayout 
    android:id="@+id/flContent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?attr/actionBarSize"/> 

Ceci est clairement l'endroit où vos fragments finiront par vivre, mais vous devrez les ajouter au cadre vous-même dans votre Java code. Vous avez en fait une méthode qui fait cela déjà:

private void displaySelectedScreen(int id){ 
    Fragment fragment = ... 

    if(fragment != null){ 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.flContent, fragment); 
     ft.commit(); 
    } 

    ... 
} 

On dirait que cela est censé être utilisé lorsque votre utilisateur clique sur un élément dans votre tiroir de navigation, mais le concept est le même. Si vous voulez que votre application démarre toujours avec le « amis » fragment affiché, vous pouvez ajouter ce code à onCreate() de votre activité Méthode:

if (savedInstanceState == null) { 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.flContent, new friend()) 
     .commit(); 
} 

Maintenant, vous aurez un fragment friend à travailler avec!

Cependant, les transactions de fragment ne sont pas garanties d'être exécutées immédiatement, même si (en tant qu'utilisateur) vous verrez toujours ce fragment friend lorsque l'application démarre, vous ne serez pas nécessairement en mesure d'interagir avec il (en tant que programmeur) immédiatement après avoir écrit ce code. Donc, vous devrez également passer votre appel à populateFriendList() à partir de votre méthode onCreate().

Au lieu de cela, vous devez remplir la liste d'amis à partir du fragment friend lui-même! Probablement le bon endroit pour le faire est à l'intérieur de la méthode onActivityCreated() de votre fragment.

Pour trouver une vue à l'intérieur d'une sous-classe Fragment, vous ne pouvez pas écrire simplement findViewById() comme vous le pouvez dans un Activity. Cependant, vous pouvez écrire ceci à la place: getView().findViewById() ... tant que vous le faites après que votre méthode onCreateView() soit revenue.

Quoi qu'il en soit, cette réponse devient extrêmement longue même si j'essaie de la garder aussi courte que possible. J'espère que c'est assez d'informations pour que votre application soit opérationnelle. Bonne chance.

+0

Si vous ne voulez pas déranger déplacer populateFriendList() 'dans votre fragment, il y a un rappel de cycle de vie de l'activité' onResumeFragments() 'où vous pouvez être sûr que votre' friend' fragment est ajouté, attaché et en cours d'exécution. Vous pourriez appeler 'populateFriendList()' à partir de là (bien que vous deviez soit être d'accord avec cette méthode étant appelée chaque fois que votre activité reprend ou écrire du code pour s'assurer qu'il ne fonctionne que la première fois que votre activité reprend). –