0

我喜欢在活动更改时更改菜单。我有 MainActivity.java 和 activity_main.xml 菜单。然后我有 MyDetailFragment.java 和 detail_view_menu.xml。MainActivity 菜单在 MainActivity.java 的 onCreateOptionsMenu 中膨胀为

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.activity_main, menu);
    return (super.onCreateOptionsMenu(menu));
}

它工作正常。当点击其中一项并加载 MyDetailFragment.java 时,我喜欢显示 detail_view_menu.xml。我的实施方式是

public class MyDetailsFragment extends Fragment {


TrackerInfo trackerInfo;
public MyDetailsFragment() {    
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view =  inflater.inflate(R.layout.my_details_fragment, container, false);  
    setHasOptionsMenu(true);
    TextView displayText = (TextView) view.findViewById(R.id.details); 
    displayText.setText(trackerInfo.getIdnumber());
    return view;
}

public void retrieveData(TrackerInfo tracker){
    trackerInfo = tracker;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.detail_view_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case R.id.track:

            return (true);

       case R.id.view_history:
            return (true);

    }

    return (super.onOptionsItemSelected(item));}}

但问题是菜单仍然是相同的activity_main 菜单并且从未改变过。可能是什么问题呢?

4

2 回答 2

0

第一:你应该有一个onCreate()高于你的方法,在onCreateView()那里你set setHasOptionsMenu(true);

第二:你需要super.onCreateOptionsMenu(menu, inflater);在你的充气机之后使用onCreateOptionsMenu()

第三:您刚刚复制了您最初在此处发布的问题。请不要在未来这样做。我已经为您提供了有关该问题的更多详细信息,然后您打开了这个问题。下次只需编辑您的原始问题。否则,您可能只会破坏自己,并让那些试图帮助您的人感到恼火。


这样做

public class MyDetailsFragment extends Fragment {


TrackerInfo trackerInfo;
public MyDetailsFragment() {    
}

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true); // this should go here not in onCreateView();

        // ....
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view =  inflater.inflate(R.layout.my_details_fragment, container, false);  
    TextView displayText = (TextView) view.findViewById(R.id.details); 
    displayText.setText(trackerInfo.getIdnumber());
    return view;
}

public void retrieveData(TrackerInfo tracker){
    trackerInfo = tracker;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.detail_view_menu, menu);
   super.onCreateOptionsMenu(menu, inflater); // you need to call super
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case R.id.track:

            return (true);

       case R.id.view_history:
            return (true);

    }

    return (super.onOptionsItemSelected(item));
    }
}
于 2013-03-24T14:57:33.510 回答
0

您需要超级调用相同的方法。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.detail_view_menu, menu);
   super.onCreateOptionsMenu(menu, inflater);
}

一旦我在新菜单项附加到菜单时遇到问题。所以我通过在添加新菜单项之前删除所有菜单项来解决它。像这样:

public static void emptyFragmentOptionsMenu(Menu menu){
        if(menu==null)return;
        for(int i=0; i < menu.size(); i++)
            menu.removeItem(menu.getItem(i).getItemId());
}

干杯,

编辑:我如何使用该方法:

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       emptyFragmentOptionsMenu(menu);
       inflater.inflate(R.menu.detail_view_menu, menu);
       super.onCreateOptionsMenu(menu, inflater);
    }
于 2013-03-24T14:01:17.990 回答