首页 > 解决方案 > 更改语言时在运行时更改片段布局(RTL,LTR)

问题描述

我正在使用抽屉导航活动来处理片段,并且我有一个选项菜单来更改区域设置,如下所示:

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 的片段: 带有本地 Fr 的片段

将本地更改为 AR (RTL) 在此处输入图像描述

关闭应用程序并重新打开它并导航到 RTL 片段 在此处输入图像描述

导航到另一个 LTR 片段(它保持 RTL 布局方向) 在此处输入图像描述

我做错了什么,实现它的最佳和干净的方法是什么?

标签: androidandroid-layoutandroid-fragmentssharedpreferences

解决方案


推荐阅读