如何在 FragmentActivity 上设置工具栏?

Posted

技术标签:

【中文标题】如何在 FragmentActivity 上设置工具栏?【英文标题】:how to set toolbar on FragmentActivity? 【发布时间】:2016-04-24 12:57:37 【问题描述】:

我想在扩展 FragmentActivity 的 Activity 上设置 工具栏。我知道为了使用setSuppoertActionBar(toolbar) 方法,我们扩展了AppCompatActivity 而不是FragmentActivity,但是我覆盖了onMenuItemSelected(int featureId, MenuItem item) 方法,它在AppCompatActivity 中是final 的,而final 方法不能覆盖。所以我仅限于扩展FragmentActivity

这是我的代码:

public class MainActivity extends FragmentActivity

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

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);   -> error is here
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    
       // Inflate the menu
       getMenuInflater().inflate(R.menu.menu_main, menu);
       return true;
    

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) 
        switch(item.getItemId())
            case R.id.action_search:
                onSearchRequested();
                break;
        
        return super.onMenuItemSelected(featureId, item);
    

我看到了很多与该问题相关的答案,但每个人都说扩展 AppCompatActivity 而不是 FragmentActivity 但我想设置工具栏以及覆盖 onMenuItemSelected(int featureId, MenuItem item) 方法。

我该怎么办,请帮忙。

【问题讨论】:

试过onOptionsItemSelected了吗? 是的,我明白了,我根据您的建议找到了解决方案。我扩展了 AppCompatActivity 而不是 FragmentActivity 并使用 onOptionsItemSelected() 方法更改了 onMenuItemSelected() 方法。谢谢:) 【参考方案1】:

这个东西在你使用NavigationDrawer时很好 使用这个:-

 toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

然后根据onNavigationItemSelected中不同Title的不同片段设置Toolbar Title:-

@Override
    public boolean onNavigationItemSelected(MenuItem item) 
        // Handle navigation view item clicks here.

        sfm = getSupportFragmentManager();
        Fragment fragment = new Fragment();
        int id = item.getItemId();

        if (id == R.id.nav_id) 
            fragment = new YourFragment();
            toolbar.setTitle("SET TOOLBAR NAME");
        else if (id == R.id.nav_id2) 
            fragment = new YourFragment();
            toolbar.setTitle("SET TOOLBAR NAME");
         

对于单个片段,首先像这样自定义您的style.xml:-

<style name="YourStyleName" parent="Theme.AppCompat.Light.DarkActionBar">
// ToDo as you want to do or as per your requirement

</style>

然后应用到您的自定义toolbar:-

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    android:layout_
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/YourStyleName" >

  // ...........


</android.support.v7.widget.Toolbar>

【讨论】:

【参考方案2】:

您也可以创建自己的toolbar

先设置主主题扩展Theme.AppCompat.Light.NoActionBar

<style name="style_1" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->

</style>

记得应用主题:

@Override
protected void onCreate(Bundle savedInstanceState) 
    this.setTheme(R.style.style_1);
    // ...

然后在您的Activity 的xml 中您可以设置自己的自定义toolbar

<include layout="@layout/my_toolbar"/>

@layout/my_toolbar 可能如下所示:

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    app:contentInsetStart="0dp"
    app:layout_collapseParallaxMultiplier="1.0">

    <!-- insert your views here -->
</android.support.v7.widget.Toolbar>

【讨论】:

【参考方案3】:
First set style as  
<style name="style_1" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->

</style>
then

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("Home");

【讨论】:

【参考方案4】:

您应该从 AppCompatActivity 扩展您的 Activity,因为这包括对 Fragments 和工具栏的支持。 然后覆盖

onCreateOptionsMenu() 和 onOptionsItemSelected() 方法

你不应该覆盖

onMenuItemSelected()

public class MainActivity extends AppCompatActivity  ...

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    FragmentTransaction ft = getSupportFragmentManager.beginTransaction();
    ....


    ....
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
      ...
         ...
    


   @Override
   public boolean onOptionsItemSelected(MenuItem item) 

   ...
  

【讨论】:

以上是关于如何在 FragmentActivity 上设置工具栏?的主要内容,如果未能解决你的问题,请参考以下文章

在手机版本上运行时,没有在 FragmentActivity 上调用 onCreateOptionsMenu

来自 FragmentActivity 的片段在某些设备上不显示背景图像

在 Android 上使用 FragmentActivity.getIntent().getExtras() 时出现 NullPointerException

无法使用兼容包 v4 解决在 Android 2.3.3 上运行的 FragmentActivity

在 Android 上恢复 FragmentActivity 后出现“java.lang.IllegalStateException:Activity 已被销毁”

尝试在空对象引用上调用虚拟方法 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationConte