Activity上に配置されたToolbarをFragment上から変更し、イベントを拾う方法【AndroidStudio】

Activity内にNaviationを使用したFragmentの遷移を実装していると

FragmentごとにActivity上のToolbar(メニュー)を書き換えたいと思いました。

※FragmentごとにToolbarを配置する方法もあると思いますが、

 あえてActivity上のToolbarをFragmentから変更しメニュー選択時の処理を記載してみました。


結論。

テンプレート(BasicActivity)を参考に、Activity上で記載している[onCreateOptionsMenu],[onOptionsItemSelected]をFragment上に記載すれば実装できます。

①ActivityでToolbarを有効化します。※テンプレートのまま

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

②Fragment内で[setHasOptionsMenu()]を有効化にし、

[onCreateOptionsMenu],[onOptionsItemSelected]を記載するだけです。

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

// **重要**
// 設定しないと[onOptionsItemSelected]が実行されない
setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
// menu レイアウトの指定
inflater.inflate(R.menu.menu_first, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if (id == R.id.firstMenu) {
// **タップ時のイベント**
}
return super.onOptionsItemSelected(item);
}



コード上にも記載していますが、Fragment内で[setHasOptionsMenu]を有効化しないと[onOptionItemSelected]が呼び出されないので注意が必要です。


他に書くことはありませんが

記録を兼ねて、簡単な画面イメージとともに一通りのソースを記載しておきます。(xmlは省略)

■MainActivity.java

package com.matsugaokagames.activitysample;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// toolbarの設定
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}

■FirstFragment.java

package com.matsugaokagames.activitysample;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;

public class FirstFragment extends Fragment {

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false);
}

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String strParam = "";

// Bundle
Bundle bundle = new Bundle();
bundle.putString("param1",strParam);
// Navigate
NavHostFragment.findNavController(FirstFragment.this)
.navigate(R.id.action_FirstFragment_to_SecondFragment,bundle);
}
});
// **重要**
// 設定しないと[onOptionsItemSelected]が実行されない
setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.menu_first, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if (id == R.id.firstMenu) {
// **タップ時のイベント**
}
return super.onOptionsItemSelected(item);
}
}

■SecondFragment.java

package com.matsugaokagames.activitysample;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;

public class SecondFragment extends Fragment {

private String param = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (savedInstanceState != null) {
param = savedInstanceState.getString("param1");
}
}

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second, container, false);
}

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

view.findViewById(R.id.button_second).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(SecondFragment.this)
.navigate(R.id.action_SecondFragment_to_FirstFragment);
}
});
// **重要**
// 設定しないと[onOptionsItemSelected]が実行されない
setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.menu_second, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if (id == R.id.secondMenu) {
// **タップ時のイベント**
}
return super.onOptionsItemSelected(item);
}
}


以上、本日の記録。


コメント

このブログの人気の投稿

AlertDialogのボタンをカスタマイズする【AndroidStudio】

レイアウトファイル上にIDが重複している場合の検索と、その有用性について【AndroidStudio】