从另一个片段更改NavigationDrawer selectedItem

时间:2014-12-07 11:00:39

标签: android android-fragments navigation-drawer

我有一个带有一个Activity(ActivityMain)和一些片段的应用程序。 NavigationDrawer控制片段的切换。在某些片段中,用户可以在不打开NavigationDrawer的情况下切换到另一个片段(例如,单击按钮)。

如果我使用NavigationDrawer在片段之间切换,一切都运行良好,但如果我在片段中使用控件(例如按钮)切换到另一个片段,我就无法设置NavigationDraver的selectedItem属性。 (实际上是ND中的ListView)selectedItem属性。

NavigationDrawer的selectedItem属性与sharedPreferences一起存储,并在 NavigationDrawer片段中的onDrawerOpened方法中恢复。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}

我试图将选择索引放在View的onClick事件中,如下所示,但是它没有工作。我也无法从其他片段中的sharedPreferences获取值。

   public void navigationRowClick(View view) {

       SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());

        switch(view.getId()) {
        case R.id.tr_conv:
            sp.edit().putInt(STATE_SELECTED_POSITION, 1);
            ((MainActivity)getActivity()).changeFrame(1);
            ((MainActivity)getActivity()).restoreActionBar();
            break;
        case R.id.trCalc:
            sp.edit().putInt(STATE_SELECTED_POSITION, 2);
            ((MainActivity)getActivity()).changeFrame(2);
            ((MainActivity)getActivity()).restoreActionBar();
            break;
        case R.id.trCalo:
            Integer i = sp.getInt(STATE_SELECTED_POSITION, 100); // get value test
            String s = i.toString();
            Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show();
            break;
        }
    }

我的问题是,如何从另一个片段设置NavigationDrawer的selectedItem?你有这个任务的最佳实践吗?

感谢您提出建议。

1 个答案:

答案 0 :(得分:1)

在用于切换片段的按钮的onClick事件中:

button.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        ((MainActivity) getActivity()).changePosition(1);
        sp.edit().putInt(STATE_SELECTED_POSITION, 1).**commit()**;
    }
});

//in MainActivity.java
private void changePosition(int position)
{
    list.setItemChecked(position, true);
}

如果您已将android:choiceMode =“singleChoice”属性设置为列表,则此方法有效。

另一种做法是在listview的适配器中执行:

.....
{
    private int mSelectedItem = 0;

    public View getView(int position, View convertView, ViewGroup parent) 
    {
        if(position == mSelectedItem) 
        {

        } 
        else 
        {

        }
    }

    public void setSelectedItem(int position)
    {
        mSelectedItem = position;
    }
}


//in MainActivity.java
private void changePosition(int position)
{
    adapter.setSelectedItem(position);
    adapter.notifyDataSetChanged();
}

还要确保将更改提交到SharedPreferences:

sp.edit().putInt(STATE_SELECTED_POSITION, 1).**commit()**;

也许你是在其他地方做的,但我没有在你所展示的片段中看到它。