20200326のAndroidに関する記事は6件です。

入門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が無いことがややこしくなる原因だと思います。

後ほど全体のコードの全体を載せるようにします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

入門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)
        }
    }

以上で完了です。左右スワイプでページの切り替えが出来ます。

スクリーンショット 2020-03-27 2.00.44.png

まとめ

とにかくViewPager2とViewPagerが紛らわしく、パレットにもViewPager2が無いことがややこしくなる原因だと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidの実機がAndroid Studioに認識されない時の対処法

概要

Androidの実機をmacのPCに入れた際にAndroid Studioにデバイスを認識させるのに手間取ったのでまとめます。

詰まるポイント

  1. デバイス側の設定
  2. adbのインストールとパスの設定
  3. Android Studioがadbを認識しない問題

1. デバイス側の設定

こちらの記事に丁寧に書いてあるので、この通りにやったらいけた。
https://techacademy.jp/magazine/2433

2. 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階層高い場所に移すことで解消した。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 install

としていたのですが、どうもエラーに。
エラー内容はこちら
error

VScodeのターミナルで実行し、エラーが出ているファイルにカーソルを載せるとcmd+クリックで該当ファイルが開けるので開いてみると・・・

なんと!空っぽ!

いやーそんなことはないだろうと思ってインストール順を逆にしてみる

$ yarn install
$ npm install

ファイルの中身がちゃんとある・・・だと・・・?

無事ビルド通ってapkファイル書き出せましたv(^^

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidアプリの審査に時間がかかるらしいが...@GooglePlayConsole

現在、流行りのコロ助の影響で時間がかかるのだろうか。。
GooglePlayConsole_longer_than_usual.png

7日以上って、、まあ仕方がないと思いつつリリースしてみると普段通りだった。
内部テストに一日前に上げてから製品版にプロモートする手順でいつも通りリリースしたが、プロモート後、20分ぐらいで公開されたみたい。

Androidアプリってほんとうに審査しているんですかね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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に変えろって言われるけど、今は無視するしかなさそう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む