如何从覆盖活动的片段中膨胀菜单

时间:2019-07-10 10:18:36

标签: android android-fragments

我有一个菜单片段,但没有按预期显示。活动工具栏可能会覆盖它

如何从片段菜单中显示菜单?现在显示的是来自活动

片段菜单的完整代码

class Search : Fragment() {

var searchAdapter: SearchAdapter? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_search, container, false)

    val toolbar = view.findViewById<Toolbar>(R.id.toolbar_search)

    // placing toolbar in place of action bar
    if(activity is AppCompatActivity){
        (activity as AppCompatActivity).setSupportActionBar(toolbar)
    }


    val recyclerView = view.findViewById<RecyclerView>(R.id.search_result_tv)

    val model = ViewModelProviders.of(this).
            get(picodiploma.dicoding.database.picodiploma.dicoding.database.search.adapter.SearchView::class.java)

    model.getData().observe(this, Observer {
        resultsItem ->

        val layoutManager = LinearLayoutManager(context)
        recyclerView.layoutManager = layoutManager

        searchAdapter = SearchAdapter((resultsItem as ArrayList<ResultsItem>?)!!, this.context!!)
        recyclerView.adapter = searchAdapter
        recyclerView.visibility = View.VISIBLE
    })

    return view
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.search, menu)
    val searchItem = menu.findItem(R.id.search_)
    val searchView = searchItem?.actionView as SearchView
    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

        override fun onQueryTextSubmit(s: String): Boolean {
            return false
        }

        override fun onQueryTextChange(s: String): Boolean {
            return false
        }
    })

}
}

完整的活动代码

public class BottomNavigation extends AppCompatActivity {

private static Fragment fragment = new Fragment();
private TvShow tvShow = new TvShow();
private FilmShow filmShow = new FilmShow();
private FavoritShow favoritShow = new FavoritShow();
private FilmFavoritShow filmFavoritShow = new FilmFavoritShow();
private Search search = new Search();
public static boolean isDeletedTv = false;
public static boolean isDeletedFilm = false;

private String title;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bottom_navigation);

    BottomNavigationView navView = findViewById(R.id.nav_view);


    Toolbar toolbar = findViewById(R.id.toolbar);

    // placing toolbar in place of action bar
    setSupportActionBar(toolbar);


    navView.setSelectedItemId(R.id.navigation_tv);
    toolbar.setVisibility(View.VISIBLE);
    getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
            tvShow).commit();
    fragment = tvShow;
    title = "Tv";

    if (isDeletedTv) {
        FavoritShow FavoritTv = new FavoritShow();

        navView.setSelectedItemId(R.id.navigation_favorit_tv);
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                FavoritTv).commit();
        fragment = FavoritTv;
        title = "Favorit";

        isDeletedTv = false;

    } else if (isDeletedFilm) {
        FilmFavoritShow FavoritFilm = new FilmFavoritShow();

        navView.setSelectedItemId(R.id.navigation_favorit_film);
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                FavoritFilm).commit();
        fragment = FavoritFilm;
        title = "Favorit Film";

        isDeletedFilm = false;
    }

    BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelected;
    navigationItemSelected = menuItem -> {
        switch (menuItem.getItemId()) {

            case R.id.navigation_tv:
                toolbar.setVisibility(View.VISIBLE);
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                        tvShow).commit();
                fragment = tvShow;
                title = "Tv";
                break;

            case R.id.search_tv:
                toolbar.setVisibility(View.GONE);
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                        search).commit();
                fragment = search;
                title = "Search Tv";

                break;

            case R.id.navigation_film:
                toolbar.setVisibility(View.VISIBLE);
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                        filmShow).commit();
                fragment = filmShow;
                title = "Film";

                break;

            case R.id.navigation_favorit_tv:
                toolbar.setVisibility(View.VISIBLE);
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                        favoritShow).commit();
                fragment = favoritShow;
                title = "Favorit";

                break;

            case R.id.navigation_favorit_film:
                toolbar.setVisibility(View.VISIBLE);
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                        filmFavoritShow).commit();
                fragment = filmFavoritShow;
                title = "Favorit Film";
                break;
        }

        toolbar.setTitle(title);
        return true;
    };


    navView.setOnNavigationItemSelectedListener(navigationItemSelected);



    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container_bottomnav,
                fragment).commit();
    } else {
        fragment = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
    }

}

@Override
protected void onSaveInstanceState(Bundle outState) {
    if (fragment.isAdded()) {
        getSupportFragmentManager().putFragment(outState, "fragment", fragment);
    }
    super.onSaveInstanceState(outState);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_change_settings) {
        Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
        startActivity(intent);
    }
    return super.onOptionsItemSelected(item);
}

}

有一个活动BottomNavigation,可以在选定底部导航栏以及菜单和标题时调用5个片段。我有一个名为Search的片段,它具有自己的菜单。如何为该菜单充气?

1 个答案:

答案 0 :(得分:2)

您可能必须覆盖自己的片段中的 onCreateOptionsMenu 。另外,您可能必须在片段oncreate中将 setHasOptionsMenu 设置为true,以使活动知道该片段具有自己的菜单:

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Your menu needs to be added here
    super.onCreateOptionsMenu(menu, inflater);
}

在执行此操作之前,您的菜单不会被夸大,您的活动也永远不会隐藏另一个片段菜单。.因此,请尝试一下!