Изменение структуры фрагмента (RTL, LTR) во время выполнения при смене языка - PullRequest
0 голосов
/ 05 июля 2018

Я использую навигацию по ящикам для обработки фрагментов, и у меня есть меню параметров для изменения локали следующим образом:

public class DrawerNavigationActivity extends AppCompatActivity implements NavigationView
    .OnNavigationItemSelectedListener, AgendaMainFragment.OnFragmentInteractionListener,
    MediaMainFragment.OnFragmentInteractionListener, VideosFragment
            .OnFragmentInteractionListener, PhotosFragment.OnFragmentInteractionListener,
    ThemesMainFragment.OnFragmentInteractionListener, AdresseMainFragment
            .OnFragmentInteractionListener, InfoMainFragment.OnFragmentInteractionListener,
    NewsMainFragment.OnFragmentInteractionListener, BlockMainFragment
            .OnFragmentInteractionListener, DemosMainFragment.OnFragmentInteractionListener{


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawer_navigation);
    setTitle(R.string.app_name);
    //########################################################### set initial fragment
    Bundle b = getIntent().getExtras();
    Fragment fragment = null;
    if(b.getInt("link") == 1) {
        fragment = new AgendaMainFragment();
    }else if(b.getInt("link") == 2){
        fragment = new MediaMainFragment();
    }else if(b.getInt("link") == 3){
        fragment = new ThemesMainFragment();
    }else if(b.getInt("link") == 4){
        fragment = new AdresseMainFragment();
    }else if(b.getInt("link") == 5){
        fragment = new InfoMainFragment();
    }else if(b.getInt("link") == 6){
        fragment = new NewsMainFragment();
    }else if(b.getInt("link") == 7){
        fragment = new BlockMainFragment();
    }else if(b.getInt("link") == 8){
        fragment = new DemosMainFragment();
    }

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.frag_drawer_container, fragment);
    ft.commit();

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

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

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        switch (id) {
            case R.id.fr:
                LocaleHelper.setLocale(getBaseContext(), "fr");
                LocaleHelper.updateGlobalConfig(getBaseContext());
                ft.detach(getVisibleFragment()).attach(getVisibleFragment()).commit();
                return true;
            case R.id.ar:
                LocaleHelper.setLocale(getBaseContext(), "ar");
                LocaleHelper.updateGlobalConfig(getBaseContext());
                ft.detach(getVisibleFragment()).attach(getVisibleFragment()).commit();
                return true;
            case R.id.en:
                LocaleHelper.setLocale(getBaseContext(), "en");
                LocaleHelper.updateGlobalConfig(getBaseContext());
                ft.detach(getVisibleFragment()).attach(getVisibleFragment()).commit();
                return true;
            case R.id.es:
                LocaleHelper.setLocale(getBaseContext(), "es");
                LocaleHelper.updateGlobalConfig(getBaseContext());
                ft.detach(getVisibleFragment()).attach(getVisibleFragment()).commit();
                return true;
        }

    return super.onOptionsItemSelected(item);
}

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = DrawerNavigationActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            if(fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment = null;
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    if (id == R.id.nav_home) {
        super.onBackPressed();
        return true;
    } else if(id == R.id.nav_agenda) {
        fragment = new AgendaMainFragment();
    } else if (id == R.id.nav_gallery) {
        fragment = new MediaMainFragment();
    } else if (id == R.id.nav_themes) {
        fragment = new ThemesMainFragment();
    } else if (id == R.id.nav_adresse) {
        fragment = new AdresseMainFragment();
    }else if (id == R.id.nav_info) {
        fragment = new InfoMainFragment();
    }else if (id == R.id.nav_news) {
        fragment = new NewsMainFragment();
    }else if (id == R.id.nav_blocs) {
        fragment = new BlockMainFragment();
    }else if (id == R.id.nav_demo_animation) {
        fragment = new DemosMainFragment();
    }else{
        return true;
    }

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.frag_drawer_container,fragment);
    ft.commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@Override
public void onAgendaFragmentInteraction(Uri uri) {

}

@Override
public void onMediaFragmentInteraction(Uri uri) {

}

@Override
public void onFragmentInteraction(Uri uri) {

}

@Override
public void onFragmentPhotoInteraction(Uri uri) {

}

для своих фрагментов я меняю заголовок панели действий следующим образом:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_news_main, container, false);

    LocaleHelper.updateGlobalConfig(getContext());

    getActivity().setTitle(getResources().getString(R.string.fgmt_titre_news));
    return view;
}

он работает плавно, за исключением языка RTL, когда я выбираю язык и язык RTL, он меняет заголовок и содержимое, но сохраняет ориентацию макета LTR, поэтому, если я закрываю приложение и снова открываю его, он изменяет ориентацию на RTL, но сохраняет ее даже для фрагментов LTR: под ориентацией я подразумеваю панель действий и навигацию по ящикам.

Фрагмент с местным Fr: fragment with local Fr

Изменить местный на AR (RTL) enter image description here

закройте приложение, снова откройте его и перейдите к фрагменту RTL enter image description here

перейти к другому фрагменту LTR (он сохраняет ориентацию расположения RTL) enter image description here

что я делаю не так и какой самый лучший и чистый способ добиться этого?

...