6

我在Android UI開發中比較新。所以我需要更多有經驗的開發人員的幫助。
我正在用Navigation Drawer創建我的應用程序,我遇到了很多問題。首先,這裏是導航抽屜的示例代碼。導航抽屜多個容器和最佳做法

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
    <!-- The navigation drawer --> 
    <ListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

這是官方網站的一個簡單示例。

主要內容視圖(上面的的FrameLayout)必須在第一子 在DrawerLayout因爲XML順序意味着z排序和 抽屜必須在內容的頂部。

在這個例子中有兩個嵌套的觀點:如前面提到的,用於存儲主要內容和ListView用於表示NavigationDrawer菜單FrameLayout

因此,這裏是我的問題。

  1. 真正的應用程序在整個活動中只有一個視圖。大部分活動有很多不同的視圖,並且有幾個片段可以使UI更加快速響應併爲用戶提供更好的用戶體驗。我的活動當然是不同的意見和片段(相同活動的目的是什麼?:))。一個活動只有一個片段,另外有幾個片段,所以他們都是不同的... 在上面的代碼示例中只有一個FrameLayout容器保持片段只有一段,我有什麼做的,如果我的活動有兩個,三或更多的片段?這種情況下最好的解決方案是什麼?
  2. 正如我描述了我的應用程序具有多種活性,因此我的導航抽屜必須(根據Android的UI規範)上的每個活動讓用戶導航到應用的頂層元素。在這種情況下,最好有一個BaseActivity(我在這裏閱讀stackoverflow的答案),它將保存所有配置的東西爲NavigationDrawer。但就導航抽屜需要DrawerLayout的XML佈局活動而言,BaseActivity應該調用setContentView方法。而且所有從BaseActivity繼承的活動都應該做一些技巧來設置自己的佈局,否則重寫此方法沒有意義,因爲它會打破所有邏輯。在這種情況下做什麼?
  3. 什麼是最有效的方式來建立像谷歌+或YouTube自定義導航抽屜式列表,而無需使用複雜視圖層次結構,這使得GPU努力工作,能夠帶來用戶不愉快的經歷

對於第二個問題,我有一些想法我怎麼能解決這個問題,但不知道它是正確的方式,什麼方法更好。
第一個想法是實現TemplateMethod模式。在BaseActivity中創建類似setupCustomViewGroup()的方法,並在所有活動中重寫它,從xml中充滿所需的視圖組,並從此方法返回它並將其用於膨脹整個視圖。

或明確添加視圖到活動中,使用合併和包括標籤。

,但這又只能爲整個活動或一個片段,做什麼,如果我們有更多的碎片,使用嵌套的片段是有幫助的,我認爲這是壞主意。

此外,我的目標是優化視圖層次結構,使其快速高效,即使在舊設備上也能保持平滑。

對於任何能夠描述或建議最有效且正確的方式來使UI響應和代碼可讀的人,我將非常感謝。

謝謝。

回答

2

1)遷移從NavigationDrawer到SlideMenu解決您的疑惑(在github上可用)。

2)確保你的BaseActivity根本沒有佈局。

3)通過ArrayAdapter擴展listview項。

希望這是幫助。

0

您可以使用碎片和在MainActivity調用它們就像這樣:

MainActivity.java 
public class MainActivity extends Activity { 
.. 
.. 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
.. 
mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 
} 

/** 
* Slide menu item click listener 
* */ 
private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     // display view for selected nav drawer item 
     displayView(position); 
    } 
} 

/** 
* Diplaying fragment view for selected nav drawer list item 
* */ 
private void displayView(int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    switch (position) { 
    case 0: 
     fragment = new HomeFragment(); 
     break; 
    case 1: 
     fragment = new FindPeopleFragment(); 
     break; 
    case 2: 
     fragment = new PhotosFragment(); 
     break; 
    case 3: 
     fragment = new CommunityFragment(); 
     break; 
    case 4: 
     fragment = new PagesFragment(); 
     break; 
    case 5: 
     fragment = new WhatsHotFragment(); 
     break; 

    default: 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

}

退房this教程,它可以幫助你更

1

解決方案:

1.我可以在這裏認爲2種情況:

  1. 多個片段,單個活動:在這種情況下,最好的方法是replace片段FrameLayoutcontent_frame當您在片段之間切換時。 navigation drawer內容對於它們保持不變
  2. 多個片段,多個活動:在這種情況下,您應該定義不同的navigation drawer內容佈局,並在切換活動時使用setHasOptionsMenu(true)調用。

2.如果您正在使用ListView作爲navigation drawer,那麼你可以很容易地通過動態填充的ListViewrow實現你的工作。儘可能避免在這種情況下從BaseActivity重寫。如果您不使用ListView作爲navigation drawer內容,那麼您可以爲不同的活動定義不同的佈局,在上面寫了點1

我覺得Google+應用程序使用ListView作爲他們custom設計navigation drawer。這取決於需要您的應用程序,無論是你可以用List去,或者你可以爲應用程序創建simple自定義佈局

我希望我的解決方案將在一定程度上