0

アクティビティが変更されたときにメニューを変更するのが好きです。activity_main.xml メニューを備えた MainActivity.java があります。次に、detail_view_menu.xml を含む MyDetailFragment.java があります。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);

2 番目:super.onCreateOptionsMenu(menu, inflater);のインフレータの後に使用する必要がありますonCreateOptionsMenu()

3 番目:最初にここに投稿した質問を複製しました。今後はそうしないでください。その質問について追加の詳細を提供しましたが、あなたはこの質問に切り替えました。次回は元の質問を編集してください。そうしないと、あなたは自分自身を妨害し、あなたを助けようとする人に迷惑をかけるかもしれません.


これを行います:

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 に答える