Activityに2つのToolbarを設置し、うち1つは画面外にあります。
Fragment上にあるリストのイベントで画面外のToolbarをアニメーションし、元のToolberに重なるように表示、非表示しています。
ですが、画面外からアニメーションしてきたToolbarのボタンイベントが走ってくれず、ボタンが押された表示(アニメーション)もありません。
初めから表示している、重なった下側のToolbarのイベントのみが走ってしまいます。
表示されているToolbarにあるボタンのイベントを拾うことができるようにするには、どこを修正すれば良いのでしょうか。
学習を始めて日が浅く、的外れであったり変な記述をしていましたら、その点を含めてご教示いただけましたら幸いです。
xml
1<?xml version="1.0" encoding="utf-8"?> 2<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <androidx.appcompat.widget.Toolbar 10 android:id="@+id/subToolbar" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:layout_marginTop="-56dp" 14 android:background="@android:color/holo_orange_dark" 15 android:gravity="top" 16 android:minHeight="?attr/actionBarSize" 17 android:theme="?attr/actionBarTheme" 18 android:translationZ="2dp" /> 19 <!-- app:menu="@menu/toolbar_sub_buttons" --> 20 21 <LinearLayout 22 android:layout_width="match_parent" 23 android:layout_height="match_parent" 24 android:orientation="vertical"> 25 26 <androidx.appcompat.widget.Toolbar 27 android:id="@+id/mainToolbar" 28 android:layout_width="match_parent" 29 android:layout_height="wrap_content" 30 android:background="@color/design_default_color_primary" 31 android:minHeight="?attr/actionBarSize" 32 android:theme="?attr/actionBarTheme" /> 33 <!-- app:menu="@menu/toolbar_main_buttons" --> 34 35 <androidx.fragment.app.FragmentContainerView 36 android:id="@+id/listFragment" 37 android:name="ListFragment" 38 android:layout_width="match_parent" 39 android:layout_height="match_parent" /> 40 41 </LinearLayout> 42 43</FrameLayout>
MainActivity
1class MainActivity : AppCompatActivity() { 2 private var _binding: ActivityMainBinding? = null 3 private val binding get() = _binding!! 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 8 _binding = ActivityMainBinding.inflate(layoutInflater) 9 setContentView(binding.root) 10 11 // メインツールバー設定 12 //setSupportActionBar(binding.mainToolbar) 13 14 // メインツールバー設定 15 val mainToolbar = binding.mainToolbar 16 mainToolbar.inflateMenu(R.menu.toolbar_main_buttons) 17 mainToolbar.setOnMenuItemClickListener{ 18 // ★★★★★常にこちらが走ってしまう★★★★★ 19 when(it.itemId) { 20 R.id.A_option_button -> AAAAA() 21 } 22 23 //true 24 false 25 } 26 27 // サブツールバー設定 28 val subToolbar = binding.subToolbar 29 subToolbar.inflateMenu(R.menu.toolbar_sub_buttons) 30 subToolbar.setOnMenuItemClickListener{ 31 // ★★★★★こちらが走らない★★★★★ 32 when(it.itemId) { 33 R.id.B_option_button -> { 34 Toast.makeText(this, "BBBBB", Toast.LENGTH_SHORT).show() 35 } 36 R.id.C_button -> { 37 Toast.makeText(this, "CCCCC", Toast.LENGTH_SHORT).show() 38 } 39 } 40 41 //true 42 false 43 } 44 } 45 46 override fun onDestroy() { 47 super.onDestroy() 48 _binding = null 49 } 50}
ListFragment
1class ListFragment : Fragment() { 2 private var _binding: FragmentListBinding? = null 3 private val binding get() = _binding!! 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 } 8 9 override fun onCreateView( 10 inflater: LayoutInflater, container: ViewGroup?, 11 savedInstanceState: Bundle? 12 ): View? { 13 _binding = FragmentListBinding.inflate(inflater, container, false) 14 return binding.root 15 } 16 17 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 18 super.onViewCreated(view, savedInstanceState) 19 20 binding.list.layoutManager = LinearLayoutManager(context) 21 binding.list.adapter = adapter 22 23 adapter.setOnClickListener { id -> 24 id?.let { 25 // Toolbar制御 26 displayToolbar(false) 27 28 (activity as? MainActivity)?.selectedId = it 29 } 30 } 31 adapter.setOnLongClickListener { id -> 32 id?.let { 33 // Toolbar制御 34 displayToolbar(true) 35 36 (activity as? MainActivity)?.selectedId = it 37 } 38 } 39 } 40 41 private fun displayToolbar(display: Boolean) { 42 var fromYDelta = 0F 43 var toYDelta = 0F 44 var translateAnimation: TranslateAnimation? = null 45 46 val mainToolbar = activity?.findViewById<Toolbar>(R.id.mainToolbar) 47 val subToolbar = activity?.findViewById<Toolbar>(R.id.subToolbar) 48 49 // 設定済みの場合は処理終了 50 if (display != mainToolbar!!.isEnabled) { return } 51 52 // 移動元、移動先の取得 53 if (display) { 54 fromYDelta = 0F 55 toYDelta = subToolbar!!.height.toFloat() 56 } else { 57 fromYDelta = subToolbar!!.height.toFloat() 58 toYDelta = -subToolbar!!.height.toFloat() 59 } 60 61 // アニメーション処理 62 translateAnimation = TranslateAnimation(0F, 0F, fromYDelta, toYDelta) 63 translateAnimation.duration = 400 64 translateAnimation.fillAfter = true 65 subToolbar.startAnimation(translateAnimation) 66 67 // メインツールバーの制御 68 //mainToolbar.isEnabled = !display 69 } 70 71 override fun onDestroyView() { 72 super.onDestroyView() 73 _binding= null 74 } 75 76}
ちなみに、当初は1つのToolbarで2つのレイアウトをinflateし分けようとしていました。
その際、切り替わりをアニメーションしたかったのですが、方法がわからず今の方法に落ち着いています。
(イメージとしてはGmailアプリで各メールのアイコンをタップした際、Toolbarが編集用(削除やアーカイブ等)のものに変わるイメージが近いです。)
こういった場合はこっちの方が簡単、セオリーはこう、等もあれば教えていただければと思います。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。