2016-08-24 8 views
8

मेरी आवश्यकता नीचे दी गई तस्वीर है मेरी नेविगेशन ड्रॉवर को दाएं तरफ से खोला जाना चाहिए। मैंने इसे लागू किया है। मेरा नेविगेशन ड्रॉवर दाएं से बाएं से खुला है। लेकिन समस्या टॉगल आइकन हमेशा बाईं तरफ है। मैं दाईं ओर टॉगल आइकन कैसे सेट कर सकता हूं। मैंने निम्नलिखित SO प्रश्न की जांच की है, लेकिन उनमें से कोई भी किसी भी मदद के लिए नहीं आया है।एंड्रॉइड नेविगेशन ड्रॉवर टॉगल आइकन दाएं

Change toggle button image Icon In Navigation Drawer right to left

Drawer Toggle in right Drawer

enter link description here

enter image description here

यहाँ मैं क्या करने की कोशिश की है। मेरी गतिविधि

public class MainActivity extends AppCompatActivity { 
    private DrawerLayout drawerLayout; 
    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     initNavigationDrawer(); 

    } 

    @TargetApi(Build.VERSION_CODES.M) 
    public void initNavigationDrawer() { 

     NavigationView navigationView = (NavigationView)findViewById(R.id.navigation_view); 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 

       int id = menuItem.getItemId(); 

       switch (id){ 
        case R.id.home: 
         Toast.makeText(getApplicationContext(),"Home",Toast.LENGTH_SHORT).show(); 
         drawerLayout.closeDrawers(); 
         break; 
        case R.id.settings: 
         Toast.makeText(getApplicationContext(),"Settings",Toast.LENGTH_SHORT).show(); 
         break; 
        case R.id.trash: 
         Toast.makeText(getApplicationContext(),"Trash",Toast.LENGTH_SHORT).show(); 
         drawerLayout.closeDrawers(); 
         break; 
        case R.id.logout: 
         finish(); 

       } 
       return true; 
      } 
     }); 
     drawerLayout = (DrawerLayout)findViewById(R.id.drawer); 

     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){ 

      @Override 
      public void onDrawerClosed(View v){ 
       super.onDrawerClosed(v); 
      } 

      @Override 
      public void onDrawerOpened(View v) { 
       super.onDrawerOpened(v); 
      } 

      @Override 
      public boolean onOptionsItemSelected(MenuItem item) { 
       if (item != null && item.getItemId() == android.R.id.home) { 
        if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { 
         drawerLayout.closeDrawer(Gravity.RIGHT); 
        } 
        else { 
         drawerLayout.openDrawer(Gravity.RIGHT); 
        } 
       } 
       return false; 
      } 
     }; 
     drawerLayout.addDrawerListener(actionBarDrawerToggle); 
     actionBarDrawerToggle.syncState(); 

     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { 
        drawerLayout.closeDrawer(Gravity.RIGHT); 
       } else { 
        drawerLayout.openDrawer(Gravity.RIGHT); 
       } 
      } 
     }); 
    } 

} 

अग्रिम धन्यवाद के लिए मेरे लेआउट के लिए

कोड activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="end"> 

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     tools:context="com.example.nav.MainActivity" 
     android:foregroundGravity="right"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="end" 
      android:theme="@style/AppTheme.AppBarOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       android:layout_gravity="right" 
       app:popupTheme="@style/AppTheme.PopupOverlay" 
       android:foregroundGravity="right" 
       android:textAlignment="viewEnd" 
       android:touchscreenBlocksFocus="false" /> 

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

     <include layout="@layout/content_main" /> 

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

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_height="match_parent" 
     android:layout_width="wrap_content" 
     android:layout_gravity="end" 
     app:headerLayout="@layout/nav_header" 
     app:menu="@menu/menu_navigation" 
     android:textAlignment="viewEnd" /> 


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

कोड।

उत्तर

20

मैं से मिलता-जुलता एक सेटअप के लिए EndDrawerToggle वर्ग लिखा था।

import android.app.Activity; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.graphics.drawable.DrawerArrowDrawable; 
import android.support.v7.widget.AppCompatImageButton; 
import android.support.v7.widget.Toolbar; 
import android.support.v7.widget.Toolbar.LayoutParams; 
import android.view.View; 
import android.view.View.OnClickListener; 


public class EndDrawerToggle implements DrawerLayout.DrawerListener { 

    private DrawerLayout drawerLayout; 
    private DrawerArrowDrawable arrowDrawable; 
    private AppCompatImageButton toggleButton; 
    private String openDrawerContentDesc; 
    private String closeDrawerContentDesc; 

    public EndDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, 
          int openDrawerContentDescRes, int closeDrawerContentDescRes) { 

     this.drawerLayout = drawerLayout; 
     this.openDrawerContentDesc = activity.getString(openDrawerContentDescRes); 
     this.closeDrawerContentDesc = activity.getString(closeDrawerContentDescRes); 

     arrowDrawable = new DrawerArrowDrawable(toolbar.getContext()); 
     arrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_END); 

     toggleButton = new AppCompatImageButton(toolbar.getContext(), null, 
               R.attr.toolbarNavigationButtonStyle); 
     toolbar.addView(toggleButton, new LayoutParams(GravityCompat.END)); 
     toggleButton.setImageDrawable(arrowDrawable); 
     toggleButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        toggle(); 
       } 
      } 
     ); 
    } 

    public void syncState() { 
     if (drawerLayout.isDrawerOpen(GravityCompat.END)) { 
      setPosition(1f); 
     } 
     else { 
      setPosition(0f); 
     } 
    } 

    public void toggle() { 
     if (drawerLayout.isDrawerOpen(GravityCompat.END)) { 
      drawerLayout.closeDrawer(GravityCompat.END); 
     } 
     else { 
      drawerLayout.openDrawer(GravityCompat.END); 
     } 
    } 

    public void setPosition(float position) { 
     if (position == 1f) { 
      arrowDrawable.setVerticalMirror(true); 
      toggleButton.setContentDescription(closeDrawerContentDesc); 
     } 
     else if (position == 0f) { 
      arrowDrawable.setVerticalMirror(false); 
      toggleButton.setContentDescription(openDrawerContentDesc); 
     } 
     arrowDrawable.setProgress(position); 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     setPosition(Math.min(1f, Math.max(0, slideOffset))); 
    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     setPosition(1f); 
    } 

    @Override 
    public void onDrawerClosed(View drawerView) { 
     setPosition(0f); 
    } 

    @Override 
    public void onDrawerStateChanged(int newState) { 
    } 
} 

EndDrawerToggle वर्ग इस मामले में ActionBarDrawerToggle के लिए एक पूर्ण प्रतिस्थापन है, तो आप सेटअप आप वर्तमान में उस के लिए है कि किसी भी जरूरत नहीं होगी। DrawerListener विधियों के लिए अभी भी ओवरराइड के लिए उपलब्ध हैं, लेकिन बुनियादी कार्यक्षमता के लिए ऐसा करना आवश्यक नहीं है, क्योंकि EndDrawerToggle दराज राज्य को अपने आप पर टॉगल करने के लिए हैंडल करता है। टॉगल को संभालने के लिए यह भी अनावश्यक है, इसलिए आपको नेविगेशन OnClickListener नेविगेशन की आवश्यकता नहीं है।

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

private EndDrawerToggle drawerToggle; 
... 

public void initNavigationDrawer() { 
    NavigationView navigationView = ... 
    ... 

    drawerLayout = (DrawerLayout)findViewById(R.id.drawer); 

    drawerToggle = new EndDrawerToggle(this, 
             drawerLayout, 
             toolbar, 
             R.string.drawer_open, 
             R.string.drawer_close); 

    drawerLayout.addDrawerListener(drawerToggle); 
} 

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

बहुत बहुत धन्यवाद, आखिरकार यह –

+2

कोई समस्या नहीं है। मदद करने में खुशी। मुझे जिक्र करना चाहिए कि अंत टॉगल 'टूलबार' का एक नियमित बच्चा है, इसलिए यदि आप अन्य बच्चे 'व्यू' जोड़ते हैं, या आपको ड्रॉपडाउन मेनू की आवश्यकता है, तो आपको देखभाल करने की आवश्यकता होगी, जिसे आप शायद चाहें संरेखण को सही रखने के लिए मैन्युअल रूप से कार्यान्वित करने के लिए। बिलकुल चौकन्ना। चीयर्स! –

+3

मुझे यह समाधान पसंद है पूर्ण जीवन आरटीएल के खिलाफ पुरुषों को बचाता है, धन्यवाद ब्रो – Michael

-1

अपनी Android मेनिफेस्ट इस लाइन को जोड़ने में: आपके आवेदन को

android:supportsRtl="true" 

, इसलिए जैसे:

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 

: अपने onCreate विधि में

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 

फिर, इस पंक्ति जोड़ें चेतावनी ::: यह केवल SdkVersion 17+ के लिए काम करता है, इसलिए यदि आपका एप्लिकेशन कम न्यूनतम एसडीके को लक्षित करता है, तो आपको crea करना होगा एक कस्टम मेनू और ऑनक्रेटऑप्शन विधि को ओवरराइड करें (जब तक कोई अन्य तरीका न हो जिसे मैं अवगत नहीं हूं, जो निश्चित रूप से संभव है)। समर्थन ActionBar रूप में एक कस्टम Toolbar साथ एक अंत गठबंधन दराज View के साथ एक DrawerLayout, एक AppCompatActivity में -

https://developer.android.com/guide/topics/manifest/application-element.html#supportsrtl

+1

उत्तर देने के लिए धन्यवाद, तकनीकी रूप से आपका समाधान पूरे ऐप की दिशा बदलता है। यह वही नहीं है जो मैं चाहता था –

+1

इसके बारे में क्षमा करें! मेरे ऐप के लिए यह केवल मेनू बदलता है! खुशी है कि आपको ऊपर सही समाधान मिला है! – LBJ33

+0

यह सही उत्तर नहीं है। आप डिफ़ॉल्ट रूप से आरटीएल लेआउट के साथ व्यवहार करने के लिए अपनी गतिविधि और पूरे ऐप को मजबूर कर रहे हैं। 'View.LAYOUT_DIRECTION_RTL' सेट करना प्रत्येक टेक्स्टव्यू और editexts को लेआउट के रूप में शुरू करने के लिए ले जाएगा जैसे कि यह अरबी भाषाओं में है। – JaydeepW

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