修复导航抽屉标题更改方向更改?

时间:2013-07-22 07:58:27

标签: android android-fragments android-actionbar navigation-drawer

在我的应用程序上更改方向后,操作栏中的标题会从导航栏中选定的片段标题更改为应用程序的标题。

Navigation drawer example app保留了方向更改的标题,因为它的片段是主要活动的子类,并且有这行代码

getActivity().setTitle(planet);

现在我有点新手,所以我不知道如何保留标题,并实施代码,你们可以帮忙吗?

万一你想看看,这里是PlanetFragment的子类

public static class PlanetFragment extends Fragment {
    public static final String ARG_PLANET_NUMBER = "planet_number";

    public PlanetFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
        int i = getArguments().getInt(ARG_PLANET_NUMBER);
        String planet = getResources().getStringArray(R.array.planets_array)[i];

        int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
                        "drawable", getActivity().getPackageName());
        ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
        getActivity().setTitle(planet);
        return rootView;
    }
}

4 个答案:

答案 0 :(得分:7)

Navigation drawer example app开始,我在这里做了什么:

  • 在您的活动onSaveInstanceState()上:

    @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); CharSequence title = mDrawerLayout.isDrawerOpen(mLeftDrawer) ? mDrawerTitle:mTitle; outState.putCharSequence(KEY_STATE_TITLE, title); }

  • 在您的活动onCreate()上:

    if (saveInstanceState!=null) { setTitle(savedInstanceState.getCharSequence(KEY_STATE_TITLE)); }

希望得到这个帮助。

答案 1 :(得分:4)

@ maohieng的回答对我有帮助,但是如果抽屉在方向改变时打开,则设置错误的标题(这是屏幕名称,而不是应用程序的标题)。所以我实现了这个完美解决问题的代码。

onSaveInstanceState()上我使用布尔值检查是否打开了抽屉。看起来很奇怪,但是当我在onCreate()上调用它时,isDrawerOpen(mDrawer)在方向改变后返回false:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putCharSequence("title", mTitle);
    outState.putBoolean("isDrawerOpen",
            mDrawerLayout.isDrawerOpen(mDrawerLinear));
}

活动的onCreate()

if (savedInstanceState == null) {
    selectItem(YOUR_FRAGMENT);
} else {
    if (savedInstanceState.getBoolean("isDrawerOpen")) {
        mTitle = savedInstanceState.getCharSequence("title");
    } else {
        setTitle(savedInstanceState.getCharSequence("title"));
    }
}

答案 2 :(得分:1)

找到一种方法来保留角色标题在动作栏中的方向变化,不确定是否最好的方式,但对我来说似乎很干净。

public class Example extends Fragment{

private String[] titleList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    titleList = getResources().getStringArray(R.array.sell_array);
    getActivity().setTitle(titleList[0]);

    return inflater.inflate(R.layout.fish, container, false);
}


}

每个片段都有各自的阵列位置编号。 另外,从Main Activity类中,我拿出了不必要的

setTitle(titleList[position]);

从现在开始选择任何导航抽屉项目,从相应的片段类

处理

答案 3 :(得分:0)

你必须添加setTitle(menuItem.getTitle());如下图所示,

@覆盖             public boolean onNavigationItemSelected(MenuItem menuItem){

            //Checking if the item is in checked state or not, if not make it in checked state
            if (menuItem.isChecked()) menuItem.setChecked(false);
            else menuItem.setChecked(true);


            **setTitle(menuItem.getTitle());**
            //Closing drawer on item click
            drawerLayout.closeDrawers();

希望得到这个帮助。