2013-07-23 35 views
27

Tôi có thanh điều hướng không có thanh tác vụ (Tôi không muốn có thanh tác vụ). Tôi đang cố gắng để làm cho nó để tôi có một nút có thể mở ngăn điều hướng.Cách mở Ngăn Điều hướng không có thanh tác vụ, chỉ mở bằng một nút

Tôi biết có một phương pháp gọi là openDrawer cho DrawerLayout http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)

Tôi không biết làm thế nào để sử dụng nó, nhưng tôi đã cố gắng thực hiện một nút khi nhấp chuột, chạy phương pháp này:

DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout); 
mDrawerLayout.openDrawer(mDrawerLayout); 

Khi tôi bấm vào nó, nó cho tôi một Java NullPointerException. Có ai có ý kiến ​​gì không?

EDIT: Mã này nằm trong một đoạn và tôi đang cố gắng tham chiếu bố cục ngăn kéo đó bên ngoài đoạn. Tôi đã sử dụng trình gỡ rối và hiển thị rằng mDrawlerLayout là NULL.

Bạn có lời khuyên nào không?

Cảm ơn!

+0

Chỉ cần thêm chỉnh sửa. – CynthiaDDurazo

Trả lời

42

Nó cung cấp cho bạn một con trỏ rỗng vì bạn đang cố gắng tìm bố cục ngăn trong giao diện của đoạn, khi nó thực sự ở chế độ xem hoạt động.

Một hack nhanh chóng để làm những gì bạn muốn là để tìm xem như:

getActivity().findViewById(R.id.drawer_layout) 

Điều đó sẽ làm việc. Cách tốt hơn là phải có một phương pháp đối với hoạt động cho mở ngăn kéo

public void openDrawer(){ 
    mDrawerLayout.openDrawer(mDrawerLayout); 
} 

Trong hoạt động onCreate chạy findViewById của bạn:

mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout); 

mDrawerLayout phải là một biến thành viên hoạt động của bạn.

Sau đó, trong đoạn của bạn, bạn có thể gọi:

//cast activity to MyActivity so compiler doesn't complain 
((MyActivity)getActivity()).openDrawer(); 

Một cách tốt hơn để làm điều đó là để tạo ra một người biết lắng nghe trong đoạn và thiết lập hoạt động như một người nghe đến đoạn. Sau đó, bạn có thể gọi một phương thức trên hoạt động, tương tự như ở trên. Tôi sẽ cho bạn một số nghiên cứu về cách làm điều đó.

+0

Cảm ơn, bạn đã làm rõ rất nhiều điều cho tôi. – CynthiaDDurazo

+12

Tôi đã phải sử dụng phương thức 'mDrawerLayout.openDrawer (Gravity.LEFT);' trong 'openDrawer' để làm cho nó hoạt động. (Tôi đang sử dụng ngăn kéo điều hướng mà không có cả hai mảnh & thanh hành động) Nếu không, nó chỉ treo ứng dụng. –

+0

Có thể xóa biểu tượng mặc định không? Ở vị trí đó tôi muốn sử dụng một menu tùy chọn khác. – JCarlos

28

drawerLayout.openDrawer(Gravity.START);

0

tôi đã viết một câu trả lời về vấn đề này ở đây: https://stackoverflow.com/a/18199771/880349

//For me a better way in avoiding a `null pointer` in getting the DrawerLayout 
    final DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); 
    btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
          //Opens the Drawer 
       drawer.openDrawer(Your View, Usually a ListView); 
      } 

       return false; 
     }); 

Bạn trực tiếp lấy ngăn kéo hiện tại bên trong một cái nhìn/fragement để bạn sẽ không nhận được một NullPointerException

0

Nó hoạt động trên Nút bấm

mButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      drawer.openDrawer(GravityCompat.START); 

     } 
    }); 
1

Nhờ @athor & @Ashish Tana.

Tôi mất rất nhiều thời gian để tìm ra lỗi (NullPointerException) Tôi đang nhận được.

Mỏ hoạt động theo cách này; Thay vì getView(), tôi sử dụng getActivity() và mở ngăn kéo theo mDrawerLayout.openDrawer(Gravity.LEFT);.

mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); 
final ImageButton btnOpenDrawer = (ImageButton) getView().findViewById(R.id.drawer_menu); 

     btnOpenDrawer.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mDrawerLayout.openDrawer(Gravity.LEFT); 
      } 
     }); 
+0

điều này thực sự làm việc tôi đặt này onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); // đặt mã tại đây } – Faisal

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