16657


Androidアプリ開発において、ListViewとTextViewをLinearLayoutで並べたい。  
AndroidStudioでNavigation Drawerを用いたアプリ開発を行っていて、  
左から出てくるメニューのカスタマイズを行いたくて、  
上にTextViewで文字（見出し）を表示、下にListViewでリストを表示というのをやるために、  
**fragment_navigation_drawer.xml** ファイル内に

[![fragment_navigation_drawer.xml](https://i.stack.imgur.com/5ix0L.png)](https://i.stack.imgur.com/5ix0L.png)

と書いたのですが、文字は表示されて、リストの方の文字は表示されませんでした。（場所の確保はされている）  
ListViewだけ抜き出して書くとちゃんと文字も表示されていて、LinearLayoutの中に入れてしまうと表示されなくなります。  
どうすればリストが表示されるか分からないので、どなたか教えていただけると嬉しいです。

* * *

`activity_main.xml`

[code]

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <fragment
        android:id="@+id/navigation_drawer"
        android:name="com.example.yuriyuri.toolbar.NavigationDrawerFragment"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        tools:layout="@layout/fragment_navigation_drawer" />
    
[/code]

`listlayout.xml`

[code]

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@android:id/text1"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textAppearance="?android:attr/textAppearanceLarge"
      android:gravity="center_vertical"
      android:textColor="#282828"
      android:paddingLeft="6dip"
      android:minHeight="?android:attr/listPreferredItemHeight"
    />
    
[/code]

`color.xml`

[code]

    <selector xmlns:android="schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
            <shape android:shape="rectangle">
                <solid android:color="#fdc6ce">
                </solid>
            </shape>
        </item>
        <item android:state_focused="true">
            <shape android:shape="rectangle">
                <solid android:color="#44F08000">
                </solid>
                <stroke android:color="#fdc6ce" android:width="2dp">
                </stroke>
            </shape>
        </item>
    </selector>
    
[/code]

'ListAdapterの実装部'

[code]

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);
        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        });
        mDrawerListView.setAdapter(new ArrayAdapter<String>(
                getActionBar().getThemedContext(),
                R.layout.listlayout,
                android.R.id.text1,
                //android.R.layout.simple_list_item_1,
                new String[]{
                        getString(R.string.title_section1),
                        getString(R.string.title_section2),
                        getString(R.string.title_section3),
                }));
        mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
        return mDrawerListView;
    }
    
[/code]


CC BY-SA 3.0
2015-09-15T08:26:14.663
16630
2015-09-16T09:59:00.090
2015-09-15T16:18:59.877
12330
12330
question
android java xml
Androidアプリ開発において、ListViewとTextViewをLinearLayoutで並べたい。


`mDrawerListView`は以下のように取得しています。

[code]

    mDrawerListView = (ListView) inflater.inflate(
                   R.layout.fragment_navigation_drawer, container, false);
    
[/code]

`inflater.inflate()`がレイアウトのルート要素を返しますので、テンプレートの
**fragment_navigation_drawer.xml**
の場合は、ルート要素である`ListView`をそのままキャストして利用することができるのです。

そこに階層を追加して`TextView`を追加したい場合、`inflater.inflate()`で返却されるものもルート要素である`LinearLayout`になってしまいますので、その対応をする必要があります。

まず、 **fragment_navigation_drawer.xml** の`ListView`に適当な`id`を付与します。

[code]

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="@string/title"/>
        <ListView
            android:id="@+id/listView" <!-- idで名前を付ける -->
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="4"
            android:choiceMode="singleChoice"/>
    </LinearLayout>
    
[/code]

あとは、`onCreateView()`でリストビューを取得する処理を、以下のように修正します。

[code]

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // ルート要素はLinearLayoutになっている
        View rootView =  inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        // そこからレイアウトで付けた"listView"という名前でリストビューを取得する
        mDrawerListView = (ListView) rootView.findViewById(R.id.listView);
        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        });
        mDrawerListView.setAdapter(new ArrayAdapter<String>(
                getActionBar().getThemedContext(),
                R.layout.listlayout,
                android.R.id.text1,
                //android.R.layout.simple_list_item_1,
                new String[]{
                        getString(R.string.title_section1),
                        getString(R.string.title_section2),
                        getString(R.string.title_section3),
                }));
        mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
        return rootView;
    }
    
[/code]


CC BY-SA 3.0
2015-09-15T16:28:18.933
16657
2015-09-16T09:59:00.090
2015-09-16T09:59:00.090
5337
5337
16630
answer