2013-05-24 11 views
35

काम नहीं कर रहा है मैं एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं और मैं http://developer.android.com/training/implementing-navigation/nav-drawer.html से उदाहरण का उपयोग करके नए नेविगेशन ड्रॉवर को एकीकृत करने की कोशिश कर रहा हूं।नेविगेशन ड्रॉवर एक्शनबार बटन

यह ज्यादातर एक चीज़ को छोड़कर काम कर रहा है, एक्शन बार अप बटन मेनू प्रदर्शित नहीं करता है, लेकिन अगर मैं किनारे से मुख्य गतिविधि स्क्रीन पर अपनी अंगुली को स्वाइप करता हूं, तो मेनू प्रकट होता है, इसलिए मुझे पता है कि कुछ भी गलत नहीं है वास्तविक मेनू के साथ, यह केवल एक्शन बार बटन है।

नीचे कोड

public class MainActivity extends Activity { 

    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 

    private CharSequence mTitle; 
    private CharSequence mDrawerTitle; 
    private String[] mPlanetTitles; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTitle = mDrawerTitle = getTitle(); 
     mPlanetTitles = getResources().getStringArray(R.array.planets_array); 

     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView)findViewById(R.id.left_drawer); 


     MenuItemAdapter menuAdapter = new MenuItemAdapter(this); 

     menuAdapter.add(new MenuItem("Hello")); 
     menuAdapter.add(new MenuItem("World")); 
     menuAdapter.add(new MenuItem("Parsnips")); 
     menuAdapter.add(new MenuItem("Turnips")); 

     mDrawerList.setAdapter(menuAdapter); 

     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     mDrawerToggle = new ActionBarDrawerToggle(
       this, 
       mDrawerLayout, 
       R.drawable.ic_drawer, 
       R.string.drawer_open, 
       R.string.drawer_closed) 
     { 
      public void onDrawerClosed(View view) 
      { 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View drawerView) 
      { 
       getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); 
      } 
     }; 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     if (savedInstanceState == null) 
     { 
      selectItem(0); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 
    } 

    private void selectItem(int position) { 
     // update the main content by replacing fragments 

     android.app.Fragment fragment = new PlanetFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(PlanetFragment.ARGS_PLANET_NUMBER, position); 
     fragment.setArguments(args); 

     android.app.FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

     mDrawerList.setItemChecked(position, true); 
     setTitle(mPlanetTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } 

    @Override 
    public void setTitle(CharSequence title) 
    { 
     mTitle = title; 
     getActionBar().setTitle(mTitle); 
    } 

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

    @Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    public static class PlanetFragment extends android.app.Fragment 
    { 
     public static final String ARGS_PLANET_NUMBER = "planet_number"; 

     public PlanetFragment() 
     { 

     } 

     @Override 
     public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) 
     { 
      View rootView = inflator.inflate(R.layout.fragment_planet, container, false); 
      int i = getArguments().getInt(ARGS_PLANET_NUMBER); 
      String planet = getResources().getStringArray(R.array.planets_array)[i]; 

      //((TextView)rootView.findViewById(R.id.fragment_text_view)).setText(planet); 
      getActivity().setTitle("Planet: " + planet); 
      return rootView; 
     } 
    } 

    private class MenuItem 
    { 
     public String menuName; 

     public MenuItem(String menuName) 
     { 
      this.menuName = menuName; 
     } 
    } 

    public class MenuItemAdapter extends ArrayAdapter<MenuItem> 
    { 
     public MenuItemAdapter (Context context) 
     { 
      super(context,0); 
     } 

     public View getView (int position, View convertView, ViewGroup parent) 
     { 
      convertView = null; 
      if (convertView == null) 
      { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_menu_item, null); 
      } 

      /*TextView title = (TextView)convertView.findViewById(R.id.row_title); 
      title.setText(getItem(position).menuName); 
      title.setVisibility(View.VISIBLE);*/ 

      EditText title = (EditText)convertView.findViewById(R.id.row_edittext); 
      title.setHint(getItem(position).menuName); 
      title.setVisibility(View.VISIBLE); 

      return convertView; 
     } 
    } 
} 

किसी भी मदद प्रदान कर सकते हैं के लिए धन्यवाद है।

उत्तर

140

आप onOptionsItemSelected

यह जहां जादू होता है लागू करने के लिए भूल गया:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Pass the event to ActionBarDrawerToggle, if it returns 
     // true, then it has handled the app icon touch event 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     // Handle your other action bar items... 

     return super.onOptionsItemSelected(item); 
    } 
+10

धन्यवाद, मुझे नहीं पता कि मैंने दस्तावेज़ों को कितनी बार चेक किया है और हर बार किसी भी तरह याद करने में कामयाब रहा। मदद – Boardy

+8

ओमग के लिए धन्यवाद, मैं दो घंटों की तरह खो गया हूं ... – Enrichman

+0

यदि मैं ऊपर एक एक्शनबार नहीं चाहता, तो क्या मैं ऊपर उल्लिखित कोड शामिल नहीं कर सकता? – cafebabe1991

4

जो लोग अभी भी परेशानी हो रही है के लिए, आप गायब हो सकता है इस विधि (ओ पी है, लेकिन मैं नष्ट कर दिया था जो) :

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 
+1

इसे 'ऑनपोस्टेट' में कॉल करने के लिए वास्तव में महत्वपूर्ण है .. 'ऑनक्रेट' में यह काम नहीं करेगा! धन्यवाद दोस्त – josemigallas

+1

यह उस बर्गर आइकन को लाया जो मैं ढूंढ रहा था। धन्यवाद :) –

0

मेरे लिए यह काम।

drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mDrawer.openDrawer(GravityCompat.START); 
     } 
    }); 
0

यहाँ मैं आप एंड्रॉयड स्टूडियो का उपयोग किए बिना एंड्रॉयड में दराज नेविगेशन बनाने के लिए सरल और आसान तरीका बता देंगे सिर्फ नेविगेशन ड्रॉर बनाने के लिए एक एडीटी इस्तेमाल किया है। यहाँ कोड एक नज़र

activity_main.xml ले जाता है

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dr_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout 
     android:id="@+id/mainContent" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/txt1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="swipe content"/> 
    <Button 
     android:id="@+id/bt1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text = "Click to open d"/> 
    </RelativeLayout> 
    <RelativeLayout 
     android:id="@+id/drawer" 
     android:layout_width="200dp" 
     android:layout_height="match_parent" 
     android:layout_gravity = "start" 
     android:background="#FFFFFF"> 
    <TextView 
     android:id="@+id/txt2" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:text="drawer content are here arr"/> 
    <Button 
     android:id="@+id/bt2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text = "Click to open d"/> 
    </RelativeLayout> 

</android.support.v4.widget.DrawerLayout> 

MainActivity.java

package com.example.drawer1; 
import android.os.Bundle; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.res.Configuration; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v4.widget.DrawerLayout.DrawerListener; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    private DrawerLayout drawerLayout; 
    private View drawerView; 
    Button bt1,bt2; 
    private DrawerListener myDrawerListner; 
    private ActionBarDrawerToggle mDrawerTogle; 
    @SuppressLint("NewApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     drawerLayout = (DrawerLayout) findViewById(R.id.dr_layout); 
     drawerView = (View) findViewById(R.id.drawer); 
     drawerLayout.setDrawerListener(myDrawerListner); 
     bt1 = (Button) findViewById(R.id.bt1); 
     bt2 = (Button) findViewById(R.id.bt2); 
     mDrawerTogle =new ActionBarDrawerToggle(this, drawerLayout, 
     R.drawable.ic_drawer,R.string.open_drawer,R.string.close_drawer){ 
      public void onDrawerOpened(View drawerView) { 
      // TODO Auto-generated method stub 
       super.onDrawerOpened(drawerView); 
       getActionBar().setTitle("SpeakEng"); 
      } 
      public void onDrawerClosed(View view) { 
      // TODO Auto-generated method stub 
       super.onDrawerClosed(view); 
       getActionBar().setTitle("SpeakEng"); 
      } 
     }; 
     drawerLayout.setDrawerListener(mDrawerTogle); 

     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     bt2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
        drawerLayout.closeDrawer(drawerView); 
      } 
     }); 

     bt1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
        drawerLayout.openDrawer(drawerView); 

      } 
     }); 
    } 
    @Override 
    public void onConfigurationChanged(Configuration newConfig){ 
     super.onConfigurationChanged(newConfig); 
     mDrawerTogle.onConfigurationChanged(newConfig); 
    } 
    public boolean onOptionsItemSelected(MenuItem item){ 
     if (mDrawerTogle.onOptionsItemSelected(item)){ 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState){ 
     super.onPostCreate(savedInstanceState); 
     //Sync the toogle state after onRestoreInstanceState has occured. 
     mDrawerTogle.syncState(); 
    } 
    } 

आप बटन पर क्लिक 2) बाएं से खींच कर दराज 1) खोल सकते हैं, 3) एक्शन बार पर ड्रॉवर आइकन पर क्लिक करने के लिए। आप चाहते हैं कि आप इसे खोल सकें। मैंने आपको तीन विकल्प दिए।

नोट: कोड में दिखाए गए अनुसार drawerLayout रूट तत्व होना चाहिए। और ऑन कॉन्फ़िगरेशन चेंज(), ऑनऑप्शन इटैम सेलेक्टेड(), ऑनपोस्टक्रेट() पर रखें। नेविगेशन ड्रॉवर बनाने के लिए यह तीन विधियां बहुत महत्वपूर्ण हैं।

शुभकामनाएं!

संबंधित मुद्दे