2016-06-16 6 views
1

私のMainActivityでは、FloatingActionButtonを使用してCardViewを既存のコンテナ(FrameLayout)にプログラマチックに追加しています。CardViewをFrameLayoutに追加すると、CardViewのXMLファイルに定義されているLayoutParamsが無視される

しかし、CardViewを追加すると、すべてのLayoutParams(幅、高さ、余白など)が無視されます。 XMLファイルで指定されたパラメータを使用する方法はありますか?ここで

は私のコードです:

card_view.xml

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/cardview" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    card_view:cardCornerRadius="2dp" 
    card_view:cardBackgroundColor="@color/cardViewBackground"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="example Text" /> 

</android.support.v7.widget.CardView> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 
     <include 
      android:id="@+id/toolbar" 
      layout="@layout/toolbar" /> 

     <TextView 
      android:id="@+id/textViewDate" 
      android:text="@string/default_main_activity_msg" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="5dp" 
      android:textColor="@color/colorPrimary" 
      android:textSize="20sp" 
      android:textAlignment="center" 
      android:padding="16dp" /> 

     <FrameLayout 
      android:id="@+id/container_body" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" /> 

     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/fab" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="16dp" 
      android:clickable="true" 
      android:src="@drawable/ic_fab_add" 
      android:layout_gravity="end" 
      android:onClick="addCard" 
      android:visibility="gone"/> 

    </LinearLayout> 


    <fragment 
     android:id="@+id/fragment_navigation_drawer" 
     android:name="com.life_hacks.liftnotes.activity.FragmentDrawer" 
     android:layout_width="@dimen/nav_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:layout="@layout/fragment_navigation_drawer" 
     tools:layout="@layout/fragment_navigation_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

と最終的に私はCardViewを追加するために使用するコード:

public void addCard(View v){ 
    View cardView = View.inflate(getApplicationContext(), R.layout.card_view, null); 
    FrameLayout container = (FrameLayout) findViewById(R.id.container_body); 
    if(container != null){ 
     container.addView(card_view); 
    } 
} 
+0

適用するパラメータの 'inflate()'コールの最後の引数として 'ViewGroup'ルート(' container')を渡す必要があります。また、 'FrameLayout'を使用してもよろしいですか? –

+0

@MikeM。私はそれを試してみるつもりだし、私は確信していない...笑、私はかなりアンドロイドの開発には新しく、これはアプリを作るための私の最初の試みです。どのようなビューをお勧めしますか? –

+0

私はあなたが垂直指向の 'LinearLayout'を望んでいると思います。ああ、コンテナ 'ViewGroup'を渡す場合、' addView() 'を呼び出す必要はありません。自動的に追加されます。 –

答えて

1

XML定義の属性が正しく適用されるためには、ViewGroupを保持する必要があります。LayoutInflaterに入力する必要があります。この場合、View.inflate()呼び出しの最後の引数としてcontainerを渡す必要があることを意味します。これを行うと、膨らんだViewが自動的にViewGroupに追加されるため、addView()に電話をかけてはいけません。IllegalStateExceptionとなります。あなたはcontainerに複数View秒を追加することがありますので、

また、LinearLayoutFrameLayoutよりも適切であろうと思われます。また、多くの追加を行う予定の場合は、ListViewまたはRecyclerViewが良いオプションになる可能性があります。

関連する問題