【问题标题】:Change the NavigationDrawer selectedItem from another fragment从另一个片段更改 NavigationDrawer selectedItem
【发布时间】:2014-12-09 13:44:15
【问题描述】:

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

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

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

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

我尝试将 View 的 onClick 事件中的选择索引设置为 STATE_SELECTED_POSITION 值,如下所示,但它不起作用。我也无法从 other Fragment 中的 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?您对此任务有最佳实践吗?

提前感谢您的建议。

【问题讨论】:

  • 在切换片段的按钮的onClick事件中 put outState.putInt(STATE_SELECTED_POSITION, position);该位置将是片段在 N​​D 列表中的位置
  • 谢谢你的建议,Goran。不幸的是,建议的解决方案不起作用。也许我没有以正确的方式使用 SharedPreferences。我已经编辑了我的帖子。

标签: android android-fragments navigation-drawer


【解决方案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()**;

也许你是在其他地方做的,但我在你展示的 sn-ps 中看不到它。

【讨论】:

  • 谢谢@Goran。凭借您的宝贵建议,我找到了可行的解决方案。我需要将更改提交到 SharedPreferences。在 NavigationDrawer 的 onDrawerStateChanged 方法中,我读回了 STATE_SELECTED_POSITION 值,并设置了检查相关列表项的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多