それぞれが異なるツールバーを持つ3つの異なるフラグメントをスワイプするビューページャーを作成しようとしています。以前にアクティビティに新しいツールバーを実装し、機能するようにしましたが、フラグメントで動作するようにしようとしています
これがフラグメントコードです
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout resource that'll be returned
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar_home);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
mToolbar.setTitle(null);
return rootView;
}
フラグメントをFragment
で拡張していますが、エラーが発生しています
Cannot resolve method setSupportActionBar
これを解決する方法がわかりません。setSupportActionBar
コードを削除すると、特定のデバイスで動作しなくなりますか?
フラグメント このようなメソッドsetSupportActionBar()
はありません。 ActionBarはActivityのプロパティです。そのため、ツールバーをactionBarとして設定するには、ActionBarActivityからアクティビティを拡張し、Fragmentを呼び出す必要があります。
((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);
[〜#〜] update [〜#〜]
AppCompatActivity を使用している場合:
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
setSupportActionBar
内のツールバーについてFragment
に言及する多くの回答を見てきましたが、Activity
にツールバーがあり、Toolbar
in Fragment
。
setSupportActionBar
をActivityのツールバーからFragmentのツールバーに移動すると、setHasOptionsMenu(true)
を使用してオーバーライドしようとしても、MenuItem
が重複する可能性があります。setSupportActionBar
のために変更が反映されないことがわかります。これを避けるために、このようなフラグメント内のツールバーメソッドを使用してメニューを膨らませて使用することをお勧めします
toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
toolbar.inflateMenu(R.menu.frag_menu_items);
Menu menu = toolbar.getMenu();
Toolbar.OnMenuItemClickListener
インターフェースを使用して、menuItemsクリックイベントで受信します。
Edit( MrEngineer13 answer からコピーされたセクション)
戻るボタンが気になる場合は、このように設定できます
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
新しいAppCompatActivityでは、ActionBarActivityの代わりに呼び出す必要があります。
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
@Faisal Naseerの回答に基づいてください。 navigationおよびメニューでカスタムToolbar
を使用するための完全な例(いくつかの注意事項あり) in Fragment
fragment_home.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"">
...
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar_home"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:title="Home" />
</androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment.kt
class HomeFragment : BaseFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
// setHasOptionsMenu(true): don't need this anymore
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
toolbar_home.setNavigationOnClickListener {
// do something when click navigation
}
toolbar_home.inflateMenu(R.menu.menu_home)
toolbar_home.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_add -> {
// do something
true
}
R.id.action_update -> {
// do something
true
}
else -> {
super.onOptionsItemSelected(it)
}
}
}
}
}
menu_home.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_add"
Android:title="@string/add_device"
app:showAsAction="never" />
<item
Android:id="@+id/action_update_room"
Android:title="@string/update_room"
app:showAsAction="never" />
</menu>
お役に立てば幸いです
これを使用して、フラグメントにツールバーを追加できます
((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);