如何从片段中获取工具栏?

我有 ActionBarActivityNavigationDrawer,并使用 support _ v7 Toolbar作为 ActionBar。在我的一个片段工具栏有自定义视图。在其他片段中,Toolbar应显示标题。

How get Toolbar instance for customizing from fragments? I can get ActionBar with getActivity().getActionBar(), but if I call setTitle() for this instance ActionBar it do nothing.

UPD:

对我来说

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(正如工程师13先生所说)在第一次片段创建时不工作,因为我从 onHiddenChanged ()调用它。现在我向 onCreateView ()添加更多的一个,它工作得很好。

170952 次浏览

如果使用 support _ v7,可能需要尝试 getActivity().getSupportActionBar().setTitle()

你需要首先将你的活动从 getActivity()转换到 AppCompatActivity,这里有一个例子:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

The reason you have to cast it is because getActivity() returns a FragmentActivity and you need an AppCompatActivity

在 Kotlin:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

如果片段应该有 ToolBar 的自定义视图,那么可以分别为每个片段实现 ToolBar。

add ToolBar into fragment_layout:

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"/>

找到它的碎片:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);


//set toolbar appearance
toolbar.setBackground(R.color.material_blue_grey_800);


//for crate home button
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

菜单侦听器可以通过两种方式创建: 覆盖片段中的 onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}

或者在 onCreateView ()中创建工具栏时为其设置监听器:

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
});
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

从您的片段: (从片段获取工具栏?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

当您在工具栏中使用 spinner 并从片段中调用工具栏中的 旋转器或自定义 观点时,这非常有帮助!

从你的活动:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

You have two choices to get Toolbar in fragment

第一个

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

还有第二个

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

For Kotlin users (activity as AppCompatActivity).supportActionBar?.show()

我用这些步骤做到了。

  1. 在主片段的 onCreateView中使用以下代码设置 Title。
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");


  1. 为了在片段之间进行交换,我使用的是底部导航栏,它是在片段的 MainActivity(Parent Activity)上实现的。即使你使用任何按钮或菜单项,然后你可以改变从 onSelectedItemClickListener的标题,就像我在我的情况下。
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    switch (menuItem.getItemId()){
    case R.id.menu_dashboard:
    getSupportActionBar().setTitle("Dashboard");
    fm.beginTransaction().hide(active).show(dashboardFragment).commit();
    active = dashboardFragment;
    return true;
    case R.id.menu_workshop:
    getSupportActionBar().setTitle("Workshops");
    fm.beginTransaction().hide(active).show(workshopFragment).commit();
    active = workshopFragment;
    return true;
    }
    return false;
    }
    

XML 格式

 <androidx.appcompat.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways">
</androidx.appcompat.widget.Toolbar>

Kotlin: 在片段中 - > onCreateView ()

setHasOptionsMenu(true)


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


(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)


(activity as? AppCompatActivity)?.supportActionBar?.show()

- > onCreateOptionsMenu ()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.app_main_menu,menu)
super.onCreateOptionsMenu(menu, inflater)
}

->onOptionsItemSelected()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.selected_id->{//to_do}
else -> super.onOptionsItemSelected(item)
}
}

如果你正在使用自定义工具栏或者 ActionBar ,并且你想从片段中获得工具栏/动作栏的引用,那么你首先需要从片段的 OnCreateView方法中获得你的 Main Activity 的实例,如下所示。

MainActivity activity = (MainActivity) getActivity();

然后使用活动进行进一步的实现,如下所示

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

在调用此函数之前,需要在 MainActivity 中初始化自定义工具栏,如下所示。

首先设置定义您的工具栏公共类似

public Toolbar toolbar;
public ActionBar actionBar;

OnCreate ()方法中分配自定义工具栏 ID

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

就是它,它会在碎片里工作。