以下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>
这甚至可能吗?还是有另一种方式来实现这个目标吗?提前致谢
答案 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。我在这里写了所有内容,所以我可能犯了一些错误,但这个想法仍然是一样的!