質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3108閲覧

drawableの中の画像を連番で表示したい。

morin

総合スコア57

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/05/23 17:04

実現したいこと

drawableの中にz1.png, z2.png ,,, z25.pngまでの画像ファイルがあります。

それを左から右にスライドさせて表示させたいと思いました。

###参考にしたページ
https://developer.android.com/training/animation/screen-slide

このページのリンクから、githubのサンプルコードをいじって作ることにしました。

javaで書かれていましたが、kotlinに直しました。

試したこと

一応、下にコード一覧を載せましたが、うまくいってないのはここです。

val storyPage = view.findViewById<ImageView>(R.id.storyPage) val imageNumber = "z${position+1}" val number = resources.getIdentifier(imageNumber, "drawable", "android") storyPage.setImageResource(number)

ググったところ、画像を連番で表示するにはgetIdentifierを使えばいいと出てきましたが、上のように試してもうまくいきません。

また、第三引数はgetPackageName()を指定しているサイトが多かったですけど、これを指定すると何故かエラーがでます。

Unresolved reference: getPackageName

試したこと2

問題がどこにあるか確かめるために以下のようなコードを入力してみました。

val storyPage = view.findViewById<ImageView>(R.id.storyPage) storyPage.setImageResource(R.drawable.z1)

こうすると、無事にz1が表示されるので、やはり、

val number = resources.getIdentifier(imageNumber, "drawable", "android")

この1行に問題があると思うのですが、なかなか解決できません。

どなたか解決方法を教えてください。

コード達

MainActivity.kt

package com.example.pdfrenderer import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentTransaction class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState == null) { val transaction: FragmentTransaction = supportFragmentManager.beginTransaction() val fragment = SlidingTabsBasicFragment() transaction.replace(R.id.sample_content_fragment, fragment) transaction.commit() } } }

SlidingTabsBasicFragment.kt

package com.example.pdfrenderer import android.content.Context import android.media.Image import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.fragment.app.Fragment import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager class SlidingTabsBasicFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return inflater.inflate(R.layout.fragment_sample, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val mViewPager = view.findViewById<View>(R.id.viewpager) as ViewPager mViewPager.setAdapter(SamplePagerAdapter()) } internal inner class SamplePagerAdapter : PagerAdapter() { override fun getCount(): Int { return 10 } override fun isViewFromObject(view: View, o: Any): Boolean { return o === view } override fun instantiateItem(container: ViewGroup, position: Int): Any { val view = activity!!.layoutInflater.inflate( R.layout.pager_item, container, false ) container.addView(view) val title = view.findViewById<View>(R.id.item_title) as TextView title.text = (position + 1).toString() // ここがうまくいかない。 val storyPage = view.findViewById<ImageView>(R.id.storyPage) val imageNumber = "z${position+1}" val number = resources.getIdentifier(imageNumber, "drawable", "android") storyPage.setImageResource(number) return view } override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { container.removeView(`object` as View) } } }

activity_main.xml

<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sample_main_layout"> <FrameLayout android:id="@+id/sample_content_fragment" android:layout_weight="10" android:layout_width="match_parent" android:layout_height="0px" /> </LinearLayout>

fragment_sample.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.viewpager.widget.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1" android:background="@android:color/white"/> </LinearLayout>

pager_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="80sp" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/storyPage"/> </LinearLayout>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

getPackageName() は Activity (正確には Context) のメソッドなので、Fragment から呼び出すには activity!!.packageName などとする必要があると思います。
参考: android - getPackageName() in Fragment - Stack Overflow

diff

1- val number = resources.getIdentifier(imageNumber, "drawable", "android") 2+ val number = resources.getIdentifier(imageNumber, "drawable", activity!!.packageName)

"android" と getPackageName() の違いですが、"android" は android.R.drawable.〜 つまり Android OS が持つリソースへのアクセスとなりますが、今回はアプリが持つリソースを利用したいので getPackageName() を使ってアプリのパッケージ名を取得する必要があります。
参考: プラットフォーム リソースにアクセスする

投稿2020/05/23 20:04

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morin

2020/05/24 06:14

できました! 気になったのですが、『Android OS が持つリソース』、『アプリが持つリソース』とはどうゆうことですか? 例えば、、『アプリが持つリソース』は、僕が直接ldrawableに格納したz1.png, z2.png ,,, z25.pngで、 『Android OS が持つリソース』はmipmap.ic_launcherみたいにもともとアプリが持ってる画像、このような理解でよろしいでしょうか。。。?
hoshi-takanori

2020/05/24 12:16 編集

それらはすべて「アプリが持つリソース」になります。プロジェクトの中に存在して、開発者が追加・編集・削除することが可能なので。Image Asset Studio や Vector Asset Studio で生成するものに関しても同様です。 https://developer.android.com/studio/write/image-asset-studio?hl=ja https://developer.android.google.cn/studio/write/vector-asset-studio?hl=ja 「Android OS が持つリソース」(正確には「プラットフォームリソース」と呼ばれるようです) というのは、OS の中にもともと用意されていて、プロジェクトに追加しなくても使える (その代わり編集はできない) もので、例えば以下のようなものがあります。(名前の一覧だけで、実際の画像や値がなくて分かりにくいのですが…。) アニメーション https://developer.android.com/reference/android/R.anim.htmlhttps://developer.android.com/reference/android/R.color.html 画像 https://developer.android.com/reference/android/R.drawable.html 文字列 https://developer.android.com/reference/android/R.string.html レイアウト https://developer.android.com/reference/android/R.layout.html これらの使い方ですが、XML ファイルの中では <Button android:background="@android:drawable/btn_default" android:text="@android:string/ok" android:textColor="@android:color/holo_orange_dark" /> とか、コードの中では textView.setText(android.R.string.cancel) imageView.setImageResource(android.R.drawable.ic_delete) listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, array) のようにして使います。
morin

2020/05/26 04:45

なるほど、pythonなどでいうimportしなくてもいい組み込み関数が『Android OSが持つリソース』みたいなイメージとして受け止めます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問