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);
}
}
以上、本日の記録。
コメント
コメントを投稿