簡體   English   中英

如何更改不同片段中的選項菜單?

[英]How can I change option menu in different fragments?

我有一個帶菜單的片段:

public class FragmentA extends Fragment {

    public FragmentA() {
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        setHasOptionsMenu(true);
    }

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

我想更改菜單但它不起作用並保留舊的操作菜單

片段 B 與上面的相同,具有不同的膨脹 XML 菜單。

public class FragmentB extends Fragment {

    public FragmentB() {
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        setHasOptionsMenu(true);
    }

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

編輯:

對不同的片段使用不同的菜單布局和對主要活動和不同的 id 使用 1 個菜單布局可能很有用

setHasOptionsMenu(true)放在構造函數中並膨脹特定於片段的菜單。

public class FragmentA extends Fragment {

    public FragmentA() {
       setHasOptionsMenu(true);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        setHasOptionsMenu(true);
    }

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

主要活動中的菜單

public class MainActivity extends Activity {
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.main_menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }
}

都可以通過 Fragment 完成 - 無需從活動中擴充菜單:

public class UpdateFragment extends Fragment  {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

        inflater.inflate(R.menu.update_menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.navUpdateProfile:
                showToast("navUpdateProfile");
                return true;

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

如果您有幾個片段共享同一個菜單,但有一些例外。

  class BaseFragment:Fragment(){
    
    open var menuId = R.menu.default_menu
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setHasOptionsMenu(true) // will apply to all children
        }
        override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
            super.onCreateOptionsMenu(menu, inflater)
            inflater.inflate(menuId, menu) // will apply to all children except for overridden
        }
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
            // all menu ids can be listed here unless specific to code in child
            when (item.itemId) {
                R.id.menu_option_1 -> {
                      // do something
                }
                R.id.menu_option_2 -> {
                    //do something
            }
            return false
        }
    }
    
    class ChildFragment:BasFragment(){
    
 override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            menuId = R.menu.menu_2 // change to a different menu as desired here
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM