【问题标题】:how to use setSupportActionBar in fragment如何在片段中使用 setSupportActionBar
【发布时间】:2016-07-04 16:39:15
【问题描述】:

我需要在我无法使用的片段中使用 setSupportActionBar 我也无法使用 setContentView 请帮助它也提前谢谢你 给出了相关代码

public class StudentrFragment extends Fragment {
        Toolbar toolbar;
        TabLayout tabLayout;
        ViewPager viewPager;
        ViewPagerAdapter viewPagerAdapter;


        public StudentrFragment() {
            // Required empty public constructor
        }


        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.tabbar_layout);
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar); 
            tabLayout = (TabLayout) findViewById(R.id.tabLayout);
            viewPager = (ViewPager) findViewById(R.id.viewPager);
            viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
            viewPagerAdapter.addFragments(new CivilFragment(),"Civil Dept");
            viewPagerAdapter.addFragments(new ComputerFragment(),"CSE Dept");
            viewPagerAdapter.addFragments(new EeeFragment(),"EEE Dept");
            viewPagerAdapter.addFragments(new EceFragment(),"ECE Dept");
            viewPager.setAdapter(viewPagerAdapter);
            tabLayout.setupWithViewPager(viewPager);

        }

    }

【问题讨论】:

标签: android android-fragments android-actionbar


【解决方案1】:

你可以在片段中这样设置SupportActionbar:

((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);

您需要在onCreateViewFragment 中膨胀tabbar_layout。 像这样:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tabbar_layout, container, false);
 //YOUR STUFF
return rootView;
}

【讨论】:

  • 把它包装起来是不是个好主意:if (getActivity() instanceof AppCompatActivity){//start using it as AppCompatActivity}。因为你不知道人们如何/在哪里使用你的片段?
  • 如果你扩展一个支持片段,它肯定会在支持(AppCompat)活动中使用,尤其是现在AndroidX发生了变化。如果你真的想检查(但应该没有必要),(activity as? AppCompatActivity)?.setSupportActionBar(myToolbar) 会。
【解决方案2】:

suggested solution 可以工作,但它看起来并不优雅,理想情况下,片段不应该对其父活动一无所知。另一种方法可能是根本不使用setSupportActionBar。如果您使用navigation 库,则可能更容易将Toolbar 添加到片段布局并使用NavigationUI 进行设置,例如:

<!-- my_fragment.xml -->
<androidx.constraintlayout.widget.ConstraintLayout ... >

  <com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/toolbar"
    app:menu="@menu/my_fragment_menu"
    ... />

</androidx.constraintlayout.widget.ConstraintLayout>
class MyFragment : Fragment() {
  ...

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val navController = findNavController()
    binding.toolbar.setupWithNavController(navController)

    binding.toolbar.setOnMenuItemClickListener {
      when (it.itemId) {
        // these ids should match the item ids from my_fragment_menu.xml file
        R.id.edit -> {
          Log.i("MyFragment", "edit menu item is clicked")

          // by returning 'true' we're saying that the event 
          // is handled and it shouldn't be propagated further
          true
        }
        else -> false
      }
    }

    // if you prefer not to use xml menu file 
    // you can also add menu items programmatically
    val shareMenuItem = binding.toolbar.menu.add(R.string.share)
    shareMenuItem.setOnMenuItemClickListener {
      Log.i("MyFragment", "share menu item is clicked")
      true
    }
  }
}

您可以找到完整的 GitHub 示例 here。另请查看另一个问题Is setSupportActionbar required anymore? 和我的answer 了解更多详情。

【讨论】:

  • 嗨 Valeriy,我看了你的例子,菜单似乎膨胀得很好。您建议将处理菜单选项选择的代码放在哪里?由于这种方式不再调用onOptionsItemSelected 方法。
  • @Wafje 请查看更新后的示例,希望对您有所帮助!
  • 完美运行,感谢您的示例,我还找到了相关的documentation
【解决方案3】:

This site has the solution which worked for me!

粘贴它:

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

AppCompatActivity activity = (AppCompatActivity) getActivity();

activity.setSupportActionBar(toolbar);

【讨论】:

    【解决方案4】:

    在 Kotlin 中为导航菜单设置支持操作栏:

    (activity as AppCompatActivity?)!!.setSupportActionBar(customToolbar as Toolbar?)
    

    还可以在 DrawerLayout 切换时为汉堡包图标设置动画:

    val actionBarDrawerToggle: ActionBarDrawerToggle = object : ActionBarDrawerToggle(activity,
                    drawer_layout, customToolbar as Toolbar?, R.string.open_drawer, R.string.close_drawer) { }
        
    drawer_layout.addDrawerListener(actionBarDrawerToggle)
    actionBarDrawerToggle.syncState()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多