0

私はactivity_main.xmlレイアウト中に別のXMLファイル(fragment_friends.xml)からリストビューIDを取得しようとしています。私は2つの方法を試しましたが、正常に動作していません。コードの作品の下インフレータを使用してAndroidスタジオのフラグメントからリストビューを取得する方法

コードの下

私はこのレイアウトに存在しないID(activity_main)を取得しようとしていますので、アプリがすぐにクラッシュします

オリジナルコード

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

が、私は私のデータベースに任意のデータを挿入または表示することはできません。

1つのコード試してみてください:コードの下

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

データベースとリストビュー作品を、私のナビゲーションバーの引き出しがなくなっていると私はactivity_mainに戻って取得しようとすると、アプリが

は2のコードを試してみてくださいクラッシュ

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

私は元の回答を削除し、ここで起こっているすべてのことをうまく処理する新しい回答を提供します。 –

+0

また、app_barメインのコードも更新しました – mmm

答えて

0

あなたの問題の根源は、一般的なAndroid Fragment APIに慣れていないと考えられます。それはいいです;誰もが始まると、新しい人です。しかし、それはあなたの質問が簡潔に(「断片について読む」を超えて)答えることは非常に難しいことを意味します。

あなたは、もちろん、フラグメントについて読むことから始める必要があります:https://developer.android.com/guide/components/fragments.html

はそれでも、私たちは簡単にここに物事をカバーできると思います。

すべてのフラグメントがアクティビティでホストされている必要があります。これを行う通常の方法は、アクティビティのXMLレイアウトに<fragment>タグを追加するか、アクティビティのxmlレイアウト<FrameLayout>を追加してを使用してFragmentTransactionを使用して、そのフレームからフラグメントを動的に追加/置換/削除します。あなたの投稿をコードで

app_bar_main.xmlの内側に、私はこれを参照してください。

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

これは明らかにあなたの断片は、最終的に住むことになるところですが、あなたはJavaでフレームに自分自身をそれらを追加する必要がありますがコード。あなたが実際に既にこれを行う方法があります:

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

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

    ... 
} 

これはあなたのユーザーがあなたのナビゲーション引き出しの中の項目をクリックするが、コンセプトは同じであるときに使用されることを意図しているように見えます。あなたのアプリが常に表示されている「友人」の断片で起動したい場合は、あなたの活動のonCreate()メソッドにこのコードを追加することができます。

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

を今、あなたはで動作するようにfriendフラグメントを持つことになります!

ただし、フラグメントトランザクションはすぐに実行されることは保証されていないため、アプリケーションの起動時にこのfriendフラグメントが(ユーザーとして)常に表示されますが、必ずしも対話できませんこのコードを書いた直後に(プログラマーとして)したがって、onCreate()メソッドからpopulateFriendList()に電話を移動する必要があります。

代わりに、friendの中からフレンドリストを入力する必要があります。おそらくこれを行う適切な場所は、フラグメントのonActivityCreated()メソッド内です。

Fragmentサブクラスの内部からビューを検索するには、findViewById()Activityに書き込むことはできません。しかし、代わりにgetView().findViewById() ...と書くことができます。あなたのonCreateView()メソッドが返された後にこれを行う限りです。

とにかく、できるだけ短くしても、この回答は非常に長くなっています。私は、これがあなたのアプリケーションを起動して実行させるのに十分な情報であることを願っています。がんばろう。

+0

フラグメント内で 'populateFriendList()'を動かしたくない場合は、フラグメントが追加され、アタッチされ、実行されています。そこから 'populateFriendList()'を呼び出すことができます(アクティビティが再開するたびにこのメソッドが呼び出されるか、アクティビティが最初に実行されたときにのみ実行されるかを確認するコードが必要です)。 –

関連する問題