web-dev-qa-db-ja.com

フラグメントでツールバーを使用する

それぞれが異なるツールバーを持つ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コードを削除すると、特定のデバイスで動作しなくなりますか?

32
Al Hennessey

フラグメント このようなメソッドsetSupportActionBar()はありません。 ActionBarはActivityのプロパティです。そのため、ツールバーをactionBarとして設定するには、ActionBarActivityからアクティビティを拡張し、Fragmentを呼び出す必要があります。

 ((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);

[〜#〜] update [〜#〜]

AppCompatActivity を使用している場合:

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

setSupportActionBar内のツールバーについてFragmentに言及する多くの回答を見てきましたが、Activityにツールバーがあり、Toolbar in Fragment

  1. setSupportActionBarをActivityのツールバーからFragmentのツールバーに移動すると、setHasOptionsMenu(true)を使用してオーバーライドしようとしても、MenuItemが重複する可能性があります。
  2. 第二に、アクティビティのツールバーを更新する場合、フラグメント内のsetSupportActionBarのために変更が反映されないことがわかります。

これを避けるために、このようなフラグメント内のツールバーメソッドを使用してメニューを膨らませて使用することをお勧めします

 toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
    toolbar.inflateMenu(R.menu.frag_menu_items);
    Menu menu = toolbar.getMenu();

Toolbar.OnMenuItemClickListenerインターフェースを使用して、menuItemsクリックイベントで受信します。

EditMrEngineer13 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
   }
});
29
Faisal Naseer

新しいAppCompatActivityでは、ActionBarActivityの代わりに呼び出す必要があります。

((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
8
muruthi

@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>

お役に立てば幸いです

enter image description here

6
Phan Van Linh

これを使用して、フラグメントにツールバーを追加できます

 ((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);
2
H.T