解決できない問題があり、至急質問させて頂きたいです。
Android StudioでECサイト型のアプリ開発を行なっています。
その商品詳細画面で、商品の写真を3枚、クリック又はスワイプで切り替える動作を行いたいです。
viewpagerでFragmentを3つ用意して、Fragment毎にimageviewを、photo1 photo2 photo3 を用意しています。
imageのpngデータはURLから取ってくる予定です。
urlから画像を取得してimageにsetしたいのですが、fragmentの3つ目だけ、参照先のfragmentのphoto3がないとエラーが出ます。
void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference ....
以下ni
fragmewntを格納してadapterに繋いでいますが、この中で3つ目のfragmentだけがどうして null object になるのかわかりません。
val fragments = arrayListOf(Product_photo1Fragment(), Product_photo2Fragment(), Product_photo3Fragment())
お気付きのことなどありましたら、教えて頂けると幸いです。
よろしくお願いいたします。
以下にコードを記載いたします。
adapter はこちら
public class product_detail_adapter(fm: FragmentManager?, private var fragments: ArrayList<Fragment>) : FragmentPagerAdapter(fm) { lateinit var fragment : Fragment init { getItem(0) } override fun getCount(): Int { return fragments.size } override fun getItem(position: Int): Fragment { return fragments[position] }
表示するActivity のviewpagerの部分 image_1,image_2, image_3が画像のurlがstringで格納されている
//ここからviewpager処理 var current_page = 1 val pager = findViewById<ViewPager>(R.id.viewPager) val fragments = arrayListOf(Product_photo1Fragment(), Product_photo2Fragment(), Product_photo3Fragment()) val adapter = product_detail_adapter(supportFragmentManager, fragments) pager.adapter = adapter val url1 = URL("${image_1}") val tlstream1 = url1.openStream() val mbitmap1 =BitmapFactory.decodeStream(tlstream1) photo1.setImageBitmap(mbitmap1) val url2 = URL("${image_2}") val tlstream2 = url2.openStream() val mbitmap2 =BitmapFactory.decodeStream(tlstream2) photo2.setImageBitmap(mbitmap2) val url3 = URL("${image_3}") val tlstream3 = url3.openStream() val mbitmap3 =BitmapFactory.decodeStream(tlstream3) photo3.setImageBitmap(mbitmap3)
Fragmentの1つ 3つあるが内容はそれぞれ変数名以外は同じ
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private const val ARG_PARAM1 = "param1" private const val ARG_PARAM2 = "param2" /** * A simple [Fragment] subclass. * Activities that contain this fragment must implement the * [Product_photo3Fragment.OnFragmentInteractionListener] interface * to handle interaction events. * Use the [Product_photo3Fragment.newInstance] factory method to * create an instance of this fragment. * */ class Product_photo3Fragment : Fragment() { private var param1: String? = null private var param2: String? = null // private var listener: OnFragmentInteractionListener? = null // override fun onCreate(savedInstanceState: Bundle?) { // super.onCreate(savedInstanceState) // arguments?.let { // param1 = it.getString(ARG_PARAM1) // param2 = it.getString(ARG_PARAM2) // } // } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_product_photo3, container, false) } // fun onButtonPressed(uri: Uri) { // listener?.onFragmentInteraction(uri) //} // override fun onAttach(context: Context) { // super.onAttach(context) // if (context is OnFragmentInteractionListener) { // listener = context // } else { // throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") // } //} //override fun onDetach() { // super.onDetach() // listener = null //} /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * * * See the Android Training lesson [Communicating with Other Fragments] * (http://developer.android.com/training/basics/fragments/communicating.html) * for more information. */ // interface OnFragmentInteractionListener { // fun onFragmentInteraction(uri: Uri) // } companion object { /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment Product_photo3Fragment. */ @JvmStatic fun newInstance(param1: String, param2: String) = Product_photo3Fragment().apply { arguments = Bundle().apply { putString(ARG_PARAM1, param1) putString(ARG_PARAM2, param2) } } } }
fragmentのXML こちらもそれぞれ変数名以外は同じ
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context=".Product_photo3Fragment"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/photo3" android:scaleType="centerCrop" app:srcCompat="@drawable/pic_product_07"/> </LinearLayout>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/14 06:07