2016-01-20 10 views
8

Sto cambiando le impostazioni internazionali a livello di codice dal frammento e tutto ok. C'è un'eccezione, il menu NavigationView, in cui la lingua non cambia. Come aggiornarlo senza ricreare tutte le attività.Aggiorna menu NavigationView dopo aver modificato le impostazioni locali

codice Mainactivity

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

    context = this; 


    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
    navigationView.setEnabled(false); 

    DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
} 

R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

    <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_layout" 
     android:layout_width="match_parent" android:layout_height="match_parent" 
     android:fitsSystemWindows="true" tools:openDrawer="start"> 

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

     <android.support.design.widget.NavigationView android:id="@+id/nav_view" 
      android:layout_width="wrap_content" android:layout_height="match_parent" 
      android:layout_gravity="start" android:fitsSystemWindows="true" 
      app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer"/> 

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

frammento di codice dopo sceglie locale

LocaleHelper.setLocale(getActivity(), getResources().getStringArray(R.array.locale)[locale]); 

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.detach(this).attach(this).commit(); 

<group android:checkableBehavior="single"> 
    <item android:id="@+id/nav_contacts" android:icon="@drawable/ic_people_black_24dp" 
     android:title="@string/contacts" android:checked="true"/> 
    <item android:id="@+id/nav_invoices" android:icon="@drawable/ic_swap_horiz_black_24dp" 
     android:title="@string/invoices" /> 
    <item android:id="@+id/nav_payments" android:icon="@drawable/ic_payment_black_24dp" 
     android:title="@string/payments" /> 
    <item android:id="@+id/nav_history" android:icon="@drawable/ic_receipt_black_24dp" 
     android:title="@string/history" /> 
    <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings_black_24dp" 
     android:title="@string/settings" /> 
    <item android:id="@+id/nav_info" 
       android:title="@string/info" android:icon="@android:drawable/ic_dialog_info"/> 
</group> 

Thanx

+0

Come stai compilando il tuo cassetto di navigazione? lista o semplici elementi di visualizzazione. – theJango

+0

elementi dal menu – koa73

risposta

2

ho deciso questo problema

private void refreshNavigationView(){ 

    getActivity().setContentView(R.layout.activity_main); 
    NavigationView navigationView = (NavigationView) getActivity().findViewById(R.id.nav_view); 

} 

Questo è abbastanza per rinfrescare NavigationView dopo il cambio locale

Ma perdo onNavigationItemSelected

Come risultato a Mainactivity

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

    // Checks the locale has changed 
    if (!currentLocale.equals(newConfig.locale)) { 
     currentLocale = newConfig.locale; 

     this.setContentView(R.layout.activity_main); 
     NavigationView navigationView = (NavigationView) this.findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(MainActivity.this); 
    } 
} 

A frammento

getActivity().onConfigurationChanged(getActivity().getResources().getConfiguration()); 
0

Si può provare a seguito di codice. Non l'ho provato ma spero che funzionerà.

for (int i = 0, count = navigationView.getChildCount(); i < count; i++) { 
    final View child = navigationView.getChildAt(i); 
    if (child != null && child instanceof ListView) { 
     final ListView menuView = (ListView) child; 
     final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter(); 
     final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter(); 
     wrapped.notifyDataSetChanged(); 
    } 
} 
+0

non funzionano sfortunatamente – koa73

+0

wrapped.getCount() return 6 it'l true, ho heve 6 elementi nel menu, ma notifyDataSetChanged() non aggiorna il menu o non capisco le nuove impostazioni locali – koa73

+0

Ho fatto questo: . (navigationView.getMenu()) addSubmenu ("xxx"); È stato aggiunto un nuovo elemento, ma non è stato modificato il locale – koa73

Problemi correlati