投稿

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

イメージ
 今回やること。 何かとメッセージ表示に使う、AlertDialogのボタンの色を変えてみます。 ※themes.xmlを使った変更をやっていきます。 ■MainActivity.java new AlertDialog.Builder( this, R.style. CustomAlertDialog ) .setTitle( "Title" ) .setMessage( "Message...." ) .setPositiveButton(android.R.string. ok , null ) .setNegativeButton(android.R.string. cancel , null ) .show() ;  ・ダイアログ作成時に、第2引数にスタイルをしてしてあげます。 ■themes.xml <style name ="CustomAlertDialog" parent ="ThemeOverlay.AppCompat.Dialog.Alert" > <item name ="buttonBarPositiveButtonStyle" > @style/AlertDialog.PositiveBtn </item> <item name ="buttonBarNegativeButtonStyle" > @style/AlertDialog.NegativeBtn </item> </style> <style name ="AlertDialog.PositiveBtn" parent ="Widget.AppCompat.Button.ButtonBar.AlertDialog" > <item name ="android:textColor" > #FFFF5050 </item> </style> <style name ="

Theme.xmlからToolbarの表示色(背景、文字)の変更をしてみる【AndroidStudio】

イメージ
Toolbarの色を変えたいよー 下の画像はテンプレートからBasicActivityを作成した時のToolbarです。 (まぁ青い。藍い。) BasicActivityではToolbarの色をThemeで指定しています。 そのため色を変更するためにはTheme.xmlを編集することで色の編集が可能です。 ■Theme.xml :itemを追加する。 <style name ="Theme.ActivitySample.AppBarOverlay" parent ="ThemeOverlay.AppCompat.Dark.ActionBar" > <item name ="colorPrimary" > @color/teal_200 </item> <!-- 追加:水色 --> <item name ="colorPrimaryVariant" > @color/teal_700 </item> <!-- 追加:濃い水色 --> <item name ="colorOnPrimary" > @color/black </item> <!-- 追加:黒 --> </style> 色を変えるだけなのであれば上記の理解で問題ないかと。 以下はちょっとした解説を記載します。 色を変える方法は、activity内の<android:theme>に指定を参照しTheme.xmlより色を取得していることはわかるかと思います。 ■activity_main.xml <com.google.android.material.appbar.AppBarLayout android :layout_width ="match_parent" android :layout_height ="wrap_content" android :theme ="@style/Theme.ActivitySampl

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.getIt

Navigationを使用した簡単なFragment間の引数の受け渡し【AdnroidStduio】

Navigationを使用した遷移時の引数の受け渡し方法 って調べてみるとなんだか複雑そうだったのですが シンプルに引数を受け渡すだけならBundleを使用した方法が可能でした。 ※NavigationでのFragment遷移(BasicActivity)をベースにまとめてみます。 まず、Fragmentの遷移にNavigationControllerのnavigate()を使用していると思いますが このメソッド、Bundleをパラメータとして受け渡しができます。   参考: NavController.navigate(int resId, Bundle args) つまり、コードで記載するとこんな感じになります。 ■FirstFragment.java (navigateにBundleを追加する。) 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) ;

Toolbarのカスタマイズ、メニュー、アイコンの表示【AndroidStudio】

イメージ
Activityのテンプレート、BasciActivityをもとに画面上のToolbarのカスタマイズ方法をまとめました。 まずは、Toolbarの設定方法 ■MainActivity.xml (ツールバーを配置) <? xml version ="1.0" encoding ="utf-8" ?> <androidx.coordinatorlayout.widget.CoordinatorLayout ……略…… tools :context =".MainActivity" > <com.google.android.material.appbar.AppBarLayout android :layout_width ="match_parent" android :layout_height ="wrap_content" android :theme ="@style/Theme.ActivitySample.AppBarOverlay" > <androidx.appcompat.widget.Toolbar android :id ="@+id/toolbar" android :layout_width ="match_parent" android :layout_height ="?attr/actionBarSize" android :background ="?attr/colorPrimary" app :popupTheme ="@style/Theme.ActivitySample.PopupOverlay" /> </com.google.android.material.appbar.AppBarLayout> </androidx.coo

ViewPager2をRecyclerView.Adapterで実装した場合のページ切り替えイベント処理実装【AndroidStudio】

ViewPager2を使っていると、ページ切替時に表示しているページ番号の切り替えなど、 PagerView2外の画面要素の書き換えがしたいと考え、 ページ切り替え時のイベント処理を実装する方法を調べてみました。 結論としては、 ViewPager2の「registerOnPageChangeCallback()」を設定することで実装できます。 javaプログラムで記載するとこんな感じ。 ViewPager2 viewPager2 ; // ***** // 略 // ***** viewPager2.registerOnPageChangeCallback( new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected ( int position) { super .onPageSelected(position) ; // ここに、ページ切り替え時に実装したい処理を記載。 } }) ; リファレンス( ViewPager2 )の記載。 「registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback callback)」 Add a callback that will be invoked whenever the page changes or is incrementally scrolled.  雑訳:ページ変更やスクロールされた場合に呼び出されるコールバックを追加する。 まんまですが、コールバックの型「ViewPager2.OnPageChangeCallback」のもつ 「onPageSelect()」(※ページが選択された際に呼び出されるメソッド)内に 実装したい処理を記載すればページを切り替えたイベントを拾えるようです。 ちょっと調べたところ、ViewPager2とFragmentStateAdapterを使用した方法は簡単に見つかったのですがRecyclerView.Adapterについてはなかなか検索にHITしませんでした。 (もしかして主流じゃない?) しかし、今回の調べ物でViewPager2.OnPageChangeCallba

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

イメージ
 例えばカレンダーのように、1つの画面に同じ要素が複数存在する場合。 レイアウト(XML)ファイル上に42個、せこせこ書いていくのは流石にかっこ悪いので 要素を1つのXMLファイルにして、レイアウト上に挿入(include)してみるのは自然なことだと思います。 <include layout ="@layout/content_calender_cell" /> <include layout ="@layout/content_calender_cell" /> <include layout ="@layout/content_calender_cell" /> <include layout ="@layout/content_calender_cell" /> <include layout ="@layout/content_calender_cell" /> <include layout ="@layout/content_calender_cell" /> ちなみに、カレンダーであれば月が替われば配置された要素の日付表示は変えたいですし 他の場合も挿入した要素内の中身をプログラム上から変更したいことが多々発生します。 しかし、挿入した要素は同一のXMLファイルのため、表示されているTextViewは同じIDを保持しているため単純に[view.findViewById(日付テキスト)]を使ってもうまく取得できません。 何か方法がないかと調べてみると、XMLファイル上で挿入時にIDが指定できること、 更に、[view.findViewById(親要素).findViewById(日付テキスト)]てな感じで検索することができることがわかりました。  参考: レイアウトを使いまわす - 他に定義したレイアウトを読み込ませる方法 つまり、レイアウトファイルの挿入時にIDを指定して <include layout ="@layout/content_calender_cell" android :id ="@+id/cal_view_da