- 投稿日:2020-03-26T20:40:59+09:00
入門ViewPager2
ViewPager2の導入
自分がViewPager2の導入につまづいたことがあるため、ハマりどころなどを挙げながら導入するまでをひと通りやってみます。
ViewPager2とViewPagerが存在する
そもそもハマってしまった問題として、「ViewPager」と「ViewPager2」が存在します。紛らわしいので注意してください。
ライブラリの追加
以下のライブラリを追加します。
// ViewPager2 implementation "androidx.viewpager2:viewpager2:1.0.0"、 implementation "com.google.android.material:material:1.2.0-alpha05"レイアウトファイルの変更
ここでも注意なのがパレットに用意されているViewPagerはViewPager2とは異なる物なので、XMLファイルをテキストで編集して仮に、
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".PagerFragment"> <androidx.viewpager2.widget.ViewPager2 android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>とします。
レイアウトファイルは準備完了です。
ViewPager2のアダプター作成
続いて、ViewPager2のためのアダプターを作成します。
class PageAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) { companion object { const val NUM_PAGES = 3 } override fun getItemCount(): Int = NUM_PAGES // Pagerの画面数 // ページを切り替えた時、表示するページの設定 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> Page1Fragment() 1 -> Page2Fragment() 2 -> Page3Fragment() else -> SliderPage1Fragment() } } }あとはフラグメントに、作成したアダプターをセットします。
pager.adapter = PageAdapter(requireContext)以上で完了です。左右スワイプでページの切り替えが出来ます。
まとめ
とにかくViewPager2とViewPagerが紛らわしく、パレットにもViewPager2が無いことがややこしくなる原因だと思います。
後ほど全体のコードの全体を載せるようにします。
- 投稿日:2020-03-26T20:40:59+09:00
入門ViewPager2 Part1
ViewPager2の導入
自分がViewPager2の導入につまづいたことがあるため、ハマりどころなどを挙げながら導入するまでをひと通りやってみます。
ViewPager2とViewPagerが存在する
そもそもハマってしまった問題として、「ViewPager」と「ViewPager2」が存在します。紛らわしいので注意してください。
ライブラリの追加
以下のライブラリを追加します。
// ViewPager2 implementation "androidx.viewpager2:viewpager2:1.0.0"、 implementation "com.google.android.material:material:1.2.0-alpha05"レイアウトファイルの変更
ここでも注意なのがパレットに用意されているViewPagerはViewPager2とは異なる物なので、XMLファイルをテキストで編集して仮に、
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".PagerFragment"> <androidx.viewpager2.widget.ViewPager2 android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>とします。
レイアウトファイルは準備完了です。
ViewPager2のアダプター作成
続いて、ViewPager2のためのアダプターを作成します。
class PageAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) { companion object { const val NUM_PAGES = 3 } override fun getItemCount(): Int = NUM_PAGES // Pagerの画面数 // ページを切り替えた時、表示するページの設定 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> Page1Fragment() 1 -> Page2Fragment() 2 -> Page3Fragment() else -> SliderPage1Fragment() } } }あとはフラグメントに、作成したアダプターをセットします。
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) activity?.let { fa -> pager.adapter = PagerAdapter(fa) } }以上で完了です。左右スワイプでページの切り替えが出来ます。
まとめ
とにかくViewPager2とViewPagerが紛らわしく、パレットにもViewPager2が無いことがややこしくなる原因だと思います。
- 投稿日:2020-03-26T18:19:52+09:00
Androidの実機がAndroid Studioに認識されない時の対処法
概要
Androidの実機をmacのPCに入れた際にAndroid Studioにデバイスを認識させるのに手間取ったのでまとめます。
詰まるポイント
- デバイス側の設定
- adbのインストールとパスの設定
- Android Studioがadbを認識しない問題
1. デバイス側の設定
こちらの記事に丁寧に書いてあるので、この通りにやったらいけた。
https://techacademy.jp/magazine/24332. adbのインストールとパスの設定
Android Debug Bridge (ADB) の設定。
この記事を参考にしたらインストールまではいけた。
https://qiita.com/furusin_oriver/items/f956848788c7a63922bdただ自分の場合、この記事通りのパスを通しても上手くいかなかった。
よく見てみると、
/Users/$(username)/Library/Android/sdk/platform-tools
の階層の中に、さらにplatform-toolsというフォルダがあった。
/Users/$(username)/Library/Android/sdk/platform-tools/platform-tools
に設定するパスを変えることでとりあえず対処した。3. Android Studioがadbを認識しない問題
ターミナルで
adb devices
と入力すると、
List of devices attached
72b96859 device
とadbでは検知されるにもかかわらず、Android Studio上ではデバイスとして検知されなかった。
これは実は先ほどのパスが違う問題が絡んでおり、
Android Studioはデフォルトで
/Users/$(username)/Library/Android/sdk/platform-tools
の方のパスを参照しているらしい。結論として、
/Users/$(username)/Library/Android/sdk/platform-tools
の内部にあったplatform-toolsの中身を1階層高い場所に移すことで解消した。
- 投稿日:2020-03-26T13:52:54+09:00
React Nativeでapkをビルドする際に「Could not list contents of 〜」で困ってる人へ
困っていた人、まさに私です。(2回目)
1回目はこちら
とりあえず(直るらしい)対処法
こちらの記事を参考に、まずはnode_modulesの再インストールをしましょう
$ pwd // アプリのディレクトリにいることを確認(iOSとかandroidじゃダメよ) $ rm -rf node_modules // node_modulesを削除 $ npm install // node_modulesをインストール大抵はこれで治るみたいですね。
ただ、私の場合はダメでした。インストールの順番の問題
私が参加しているプロジェクトではyarnも使っています。
なのでnode_modulesをインストールしていたときには$ npm install $ yarn installVScodeのターミナルで実行し、エラーが出ているファイルにカーソルを載せるとcmd+クリックで該当ファイルが開けるので開いてみると・・・
なんと!空っぽ!
いやーそんなことはないだろうと思ってインストール順を逆にしてみる
$ yarn install $ npm installファイルの中身がちゃんとある・・・だと・・・?
無事ビルド通ってapkファイル書き出せましたv(^^
- 投稿日:2020-03-26T11:36:18+09:00
Androidアプリの審査に時間がかかるらしいが...@GooglePlayConsole
7日以上って、、まあ仕方がないと思いつつリリースしてみると普段通りだった。
内部テストに一日前に上げてから製品版にプロモートする手順でいつも通りリリースしたが、プロモート後、20分ぐらいで公開されたみたい。Androidアプリってほんとうに審査しているんですかね。
- 投稿日:2020-03-26T10:17:11+09:00
Navigation Componentの注意点
Navigation Componentを使っていて嵌ったポイント
update
@FKbelm さんからfindFragmentById
を使えば大丈夫だと教えてもらいました。ハマったこと
Navigation Componentを使って、ToolbarをActivityに持たせていたら、該当のViewを表示する時に
java.lang.IllegalStateException: Activity Caused by: java.lang.IllegalStateException: Activity {Activity} does not have a NavController set on {nav_host_fragmentのid}が出た。
原因
FragmentContainerViewを使って、
<com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="enterAlways|scroll" /> </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:navGraph="@navigation/nav_graph" />のように書いてると
toolbar.setupWithNavController(findNavController(R.id.nav_host_fragment))でNavControllerが見つからないと例外が投げられる。
対策
FragmentContainerViewじゃなくfragmentを使えばいい。val navController = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) toolbar.setupWithNavController(navController!!.findNavController())という呼び方をすれば大丈夫そう
余談
lintでfragmentをFragmentContainerViewに変えろって言われるけど、今は無視するしかなさそう。