嵌套复合视图/包含/合并

时间:2015-09-08 10:00:02

标签: android android-layout xamarin xamarin.android navigation-drawer

以下XML是我视图的测试布局。它在左侧显示NavigationDrawer,在视图顶部显示工具栏。工具栏左上角显示标题和汉堡图标以切换NavigationDrawer。一切正常:

我的XML(我删除了所有高度/宽度属性,因为它更易读):

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:fitsSystemWindows="true">
    <LinearLayout
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            android:id="@+id/my_awesome_toolbar"
            android:minHeight="?attr/actionBarSize"
            android:background="?attr/colorPrimary" />
    <!-- ** MY VIEW ELEMENTS **-->
    </LinearLayout>
    <LinearLayout
        android:id="@+id/drawer_leftpane"
        android:orientation="vertical"
        android:layout_gravity="left|start"
        android:background="#FFFFFF"
        android:fitsSystemWindows="true">
        <TextView
            android:text="Test string on top of list" />
        <android.support.v7.widget.RecyclerView
            android:id="@+id/drawer_menulist"
            android:scrollbars="vertical"
            android:choiceMode="singleChoice"
            android:divider="@null" />
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

<!-- ** MY VIEW ELEMENTS **-->部分中,我插入了不同视图的视图元素(这是所有视图之间唯一的变化)。

我有很多观点需要上面这个布局。我知道includes,合并和compound views,并阅读了很多关于这些的文章。但是我无法为这个特殊情况创建一个布局,我想避免在我的所有视图中复制粘贴整个布局。

最后,我希望我的所有观点都是这样的:

<?xml version="1.0" encoding="utf-8"?>
<MyDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawer_layout"
    android:fitsSystemWindows="true">
    <!-- ** MY VIEW ELEMENTS **-->
</MyDrawerLayout>

这甚至可能吗?还是有另一种方式来实现这个目标吗?提前致谢

2 个答案:

答案 0 :(得分:0)

你需要删除它。这是错误的想法:

<LinearLayout
    android:orientation="vertical">
    <android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary" />
<!-- ** MY VIEW ELEMENTS **-->
</LinearLayout>

请使用:

<android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary" />

在Java中查找视图,然后将您膨胀的视图添加到其中。

然后,您可以为您拥有的不同工具栏配置提供单独的XML布局,并动态扩充它们。 E.G。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    orientation:horizontal>

<TextView
    android:id="@+id/action_bar_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:singleLine="true"
    android:ellipsize="end"
    android:layout_marginRight="@dimen/dp_fortytwo"
    android:text="@string/app_name"
    android:textColor="@color/primary_text"
    android:textSize="@dimen/dp_eighteen"/>

</LinearLayout>

为您的导航保留一个Singleton类很方便,该类导入了工具栏中的ViewGroup。你可以给一个&#34;动作栏&#34;进入工具栏:

toolBar = (Toolbar) drawerLayout.findViewById(R.id.toolbar);
context.setSupportActionBar(toolBar);
actionBar = (ViewGroup) LayoutInflater.from(context()).inflate(R.layout.actionbar, toolBar, false);
toolBar.addView(actionBar);

然后动态添加视图:

LayoutInflater.from(context).inflate(R.layout.actionbar_home_icon, actionBar, true);

答案 1 :(得分:0)

好吧,我只想使用 LayoutInflater

首先,我会创建FrameLayout作为布局的容器。 然后我会膨胀所需的布局。 如果我需要给另一个布局充气,我会做view_container.removeAllViews( )并给另一个布局充气。

一切都在行动

<强> main.xml中

<!-- it's not full layout, I've just taken a fragment from your example -->

<LinearLayout
    android:orientation="vertical" >

    <android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary" />

    <!-- This is where you hold required layout -->
    <FrameLayout
        android:id="@+id/view_container"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent" />

</LinearLayout>

<强> Main.java

public class Main extends AppCompatActivity
{
    @Override public void onCreate( Bundle savedInstaceBundle )
    {
        super.onCreate( );
        setContentView( R.layout.main );

        FrameLayout view_container = ( FrameLayout ) findViewById( R.id.view_container );

        /** To inflate layout **/
        LayoutInflater inflater = getApplicationContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        inflater.inflate( /*R.layout.my_layout */, view_container );

        /** To remove layout in 'view_container' **/
        view_container.removeAllViews( );

        /** To change layout in 'view_container' **/
        // 1. Remove all views
        // 2. Inflate required layout
    }
}

<强> P.S。我在这里写了所有内容,所以我可能犯了一些错误,但这个想法仍然是一样的!