0

以下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

您需要將其刪除。這是錯誤的想法:

<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> 

爲工具欄中引用ViewGroup的導航保留一個Singleton類很方便。如根據需要動態

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); 
+0

我不能刪除工具欄佈局(正如你所說),因爲那麼我不能用'drawerLayout.findViewById(R.id.toolbar)找到它;'或者我錯過了什麼? – Joehl

+0

我想說,你應該*不*將工具欄包裝在LinearLayout中。這似乎毫無意義。我試圖說你應該找到工具欄: 工具欄工具欄=(工具欄)findViewById(R.id。my_awesome_toolbar); 然後膨脹並將您的自定義佈局添加到該工具欄中。 –

+0

但我想在所有活動中使用相同的工具欄。並且工具欄位於LinearLayout中,否則它不會顯示在視圖之上。在這個LinearLayout裏面有其他的視圖元素,這取決於不同的活動。 – Joehl

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> 

主。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 
    } 
} 

附:我把它寫在這裏,所以我可能犯了一些錯誤,但這個想法仍然是一樣的!

+0

因此,您只需要一個活動,並在運行時更換內容?我明白了嗎? – Joehl

+0

**是**。另外,我建議爲每個想要膨脹到'view_container'的佈局創建單獨的佈局文件,以使項目更美觀些。P – Sw3das

+0

謝謝。但這不是我的選擇。我不能只有一項活動... – Joehl