更改语言时在运行时更改片段布局(RTL,LTR)

时间:2018-07-05 12:48:56

标签: android android-layout android-fragments sharedpreferences

我正在使用“抽屉导航”活动来处理片段,并且我有一个选项菜单可以像这样更改区域设置:

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

我在做错什么,并且最好的,干净的方法是什么?

0 个答案:

没有答案
相关问题