2016-03-18 11 views
8

Những gì tôi đang cố gắng để làm, là có một menu NavigationDrawer như thế này: NavigationDrawerAndroid: NavigationDrawer/nhiều hoạt động/cùng một trình đơn

Tôi đã tìm ra cách để thay đổi bố cục khi các mục menu được nhấp, nhưng làm thế nào thế nào để tôi tải một hoạt động mới mà không làm mất menu?

Câu hỏi chính của tôi:

Ví dụ: một trong các tùy chọn trình đơn của tôi sẽ đưa bạn đến bố cục có một số nút làm điều gì đó. Tôi cần tải một hoạt động/lớp học kèm theo, điều đó sẽ xử lý các hành động và chức năng của "trang" cụ thể đó trong Ứng dụng. Nếu một tùy chọn menu khác đưa bạn đến bố cục chỉ với một hình ảnh, chẳng hạn, đó sẽ là một hoạt động khác mà không có tất cả mã đó xử lý chức năng của các nút, vì không có nút nào trong màn hình này.

Tôi hy vọng điều đó có ý nghĩa! Tôi đã làm theo nhiều hướng dẫn/video trực tuyến bằng một số phương pháp (Phân đoạn, v.v.) nhưng không có gì trả lời được câu hỏi của tôi.

+0

Bằng cách này, những gì tôi đang làm bây giờ là tôi có một BaseActivity mà đặt NavigationDrawer tại chỗ và tải lên bố trí chính. Tôi biết rằng tôi có thể lặp lại mã này trong mọi hoạt động, nhưng tôi đang cố gắng tránh phải lặp lại mã. Tôi đã thử các lớp khác của tôi mở rộng BaseActivity này, nhưng sau đó tôi không biết làm thế nào để tải lên một bố cục mới mà không làm mất menu –

Trả lời

19

Từ những gì tôi hiểu, bạn muốn ngăn điều hướng hiển thị trong mọi hoạt động. Có hai phương pháp:

  1. Sử dụng câu trả lời của @ Russell. Thực hiện một hoạt động chính có một framelayout thường được gọi là content_frame bao gồm toàn bộ hoạt động. Hoạt động này có mã cho ngăn điều hướng. Khi nhấp vào nút, bạn có thể thay thế nội dung của bố cục này bằng bố cục của đoạn mong muốn (tức là một đoạn có nhiều nút hoặc nói một hình ảnh). Vì vậy, các yếu tố trong ngăn kéo là tất cả các mảnh. Trong hướng dẫn, các mảnh được gọi thông qua getFragmentManager(). Xem chuỗi video trên ngăn điều hướng của những người này, slidenerd: https://www.youtube.com/watch?v=K8hSIP2ha-g. Hãy thử triển khai nó khi bạn đang đi dọc theo video

  2. Cá nhân tôi thích phương pháp này nhưng nó có những hạn chế của nó. Tạo một baseactivity trong đó mã cho ngăn điều hướng là. Điều này có một framelayout thường được gọi là content_frame bao gồm toàn bộ hoạt động. Các hoạt động cần phải có ngăn kéo mở rộng này baseactivity thay vì appcompatactivity hoặc hoạt động. Lạm phát bố trí hoạt động như thế này trong quá trình khởi tạo: getLayoutInflater().inflate(R.layout.activity_this, contentFrameLayout); thay vì setContentView. Tại đây, các hoạt động được bắt đầu qua startActivity. Nhược điểm của phương pháp này: a) BaseActivity bị hủy và tái tạo mỗi khi người dùng thay đổi hoạt động. b) Hoạt động này chỉ có thể mở rộng một lớp theo mặc định trở thành Ưu điểm cơ bản: a) Bạn có thể duy trì một chồng hoạt động b) Mỗi ​​hoạt động có thể có các quy tắc thay đổi cấu hình riêng và quy tắc onsaveInstance.c) Các hoạt động này có thể có các đoạn riêng biệt, sử dụng hoạt động này để liên lạc. Đang cố gắng để làm điều này trong phương pháp đầu tiên sẽ bao gồm các hoạt động chính triển khai số lượng lớn các giao diện không cần thiết (bạn sẽ tìm hiểu về giao diện trong giao tiếp liên fragment)

1

Nếu bạn bắt đầu một hoạt động mới, bạn sẽ mất menu vì hoạt động mới sẽ bao gồm hoạt động cũ. Bạn cần sử dụng phân đoạn cho việc này. Hãy suy nghĩ về các mảnh vụn như các hoạt động có thể sống trong một hoạt động khác.

Sử dụng phân đoạn, nhưng thêm phần tử giao diện người dùng của bạn vào bố cục hoạt động bên ngoài FrameLayout (id: content_frame), sau đó khi bạn nhấp vào mục menu, giao dịch phân đoạn của bạn sẽ chỉ ảnh hưởng đến content_frame FrameLayout, để lại tất cả các mục bố cục khác tại chỗ.

Hằng trong đó, bạn thân, nó chỉ trở nên rõ ràng hơn từ đây ... cho đến khi bạn nhấn tường tiếp theo: D

Tôi đề nghị hướng dẫn này: https://www.udacity.com/course/viewer#!/c-ud853/l-1395568821

Và tài liệu này: http://developer.android.com/training/implementing-navigation/nav-drawer.html

32

Nhờ có câu trả lời ở trên tôi đã có thể thực hiện chính xác những gì tôi muốn, đây là chính xác những gì tôi đã làm cho bất cứ ai tìm kiếm này trong tương lai:

activity_main.xml của tôi trông như thế này:

<!--When the DrawerLayout is the root layout, the first child--> 
<!--of that layout is the contents of the main screen, and the--> 
<!--second child is the contents of the menu--> 

<!--First child layout--> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include 
     layout="@layout/toolbar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/content_frame"/> 

</LinearLayout> 

<!--Second child layout--> 
<android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/navigation_drawer_header" 
    app:menu="@menu/drawer_menu"> 

</android.support.design.widget.NavigationView> 

Đây là DrawerLayout tiêu chuẩn, kéo tất cả các bit và phần cho menu NavigationDrawer. Việc bổ sung quan trọng vào đây là FrameLayout ... bit mà tôi đã cung cấp ID content_frame. Đây là nơi tất cả các bố cục khác được sử dụng bởi các hoạt động khác sẽ được đẩy/thêm/tăng cao.

My BaseActivity.java trông như thế này:

package com.example.test; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuItem; 

public class BaseActivity extends AppCompatActivity { 

    DrawerLayout drawerLayout; 
    ActionBarDrawerToggle actionBarDrawerToggle; 
    Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_closed); 
     drawerLayout.setDrawerListener(actionBarDrawerToggle); 

     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem item) { 
       switch (item.getItemId()) { 

        case R.id.menu_home: 
         Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); 
         startActivity(loadPlayer); 
         drawerLayout.closeDrawers(); 
         break; 

       } 
       return false; 
      } 
     }); 

    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     actionBarDrawerToggle.syncState(); 
    } 

} 

Bây giờ, trong phương pháp onNavigationItemSelected, có một câu lệnh switch để xử lý những gì sẽ xảy ra khi mỗi mục menu được chọn. Đây là bit quan trọng:

Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); 
startActivity(anIntent); 
drawerLayout.closeDrawers(); 

Bạn cần thay "TheClassYouWantToLoad" bằng lớp của riêng bạn. Bây giờ trong lớp mới này (mà có lẽ đòi hỏi một số yếu tố giao diện người dùng mới được nạp), bạn cần như sau:

public class TheClassYouWantToLoad extends BaseActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 

FrameLayout contentFrameLayout = (FrameLayout) findViewById(R.id.content_frame); //Remember this is the FrameLayout area within your activity_main.xml 
getLayoutInflater().inflate(R.layout.the_layout_you_want_to_load, contentFrameLayout); 
    } 
} 

và thay thế "the_layout_you_want_to_load" với tên của bố cục bạn muốn tải.

+0

Cảm ơn bạn rất nhiều! – Denny

+0

Làm việc như một sự quyến rũ và rất dễ hiểu, Cảm ơn! –

+1

Điều hướng thông qua điều hướngDrawer luôn bổ sung vào Stack Back của Taks. Để tránh lãng phí bộ nhớ và dễ dàng điều hướng (nếu điều hướng đến cùng một hoạt động chính nó sẽ tải lại trạng thái cuối cùng) có thể là tốt để thêm vào tệp AndroidManifests.xml của bạn vào mỗi tham số 'android: launchMode =" singleTask "'. Điều này sẽ ngăn chặn ngăn xếp ngày càng tăng ... Xem: [Ngăn xếp hướng dẫn API] (https://developer.android.com/guide/components/activities/tasks-and-back-stack.html#ManagingTasks) –

Các vấn đề liên quan