【发布时间】:2022-01-24 00:36:32
【问题描述】:
编辑:在 JonR85 的回答之后,它返回了图像适配器,但现在在返回膨胀的视图后,它使应用程序崩溃
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
var _galleryFragment:View?
_galleryFragment = requireActivity().findViewById<View>(R.id.gallery_fragment) as View
galleryFragment = GetGalleryFragment(inflater,container) as View
galleryNumberText = (galleryFragment).findViewById(R.id.galleryNumber) as? TextView?
recyclerView = (galleryFragment).findViewById(R.id.recyclerViewImageItems) as? RecyclerView?
if(ContextCompat.checkSelfPermission(this.context as Context,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this.parentFragment?.getActivity() as MainActivity,
Array<String>(2){Manifest.permission.READ_EXTERNAL_STORAGE},READ_PERMISSION_CODE)
var i:Any?;
}
else
{
loadImages()
}
return galleryFragment
}
我一直在尝试在一个片段中设置一个 recyclerview(它首先被膨胀然后分配对象(recycler 视图和文本视图)在包含 recyclerview 的图像的类中并请求许可,但不知何故只是当它加载它关闭应用程序的recyclerview(显然在 E/AndroidRuntime: 致命异常: main 进程:com.example.applicationtest,PID:14303 java.lang.NullPointerException 在 com.example.applicationtest.gallery_fragment.loadImages(gallery_fragment.kt:140) 在 com.example.applicationtest.gallery_fragment.onCreateView(gallery_fragment.kt:104) 在 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) 在 androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) 在 androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) 在 androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) 在 androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:236) 在 android.app.ActivityThread.main(ActivityThread.java:8037) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
调用 GalleryAdapter 的构造函数
我在片段的不同视图中创建了一个 galleryElement(我没有包含它),可能导致崩溃的原因是什么?
fun loadImages(){
recyclerView!!.setHasFixedSize(true)
recyclerView!!.layoutManager = GridLayoutManager(this.activity,4)
try {
this.imageList = ImageGallery.GetImagesList(this.context as Context )
}
catch (ex:Exception)
{
println(ex.message)
}
galleryAdapter = GalleryAdapter(this.context as Context,imageList,
object : IPhotoInterface {
override fun onPhotoClick(stringPath: String):Unit {
//process picture on click
}
})
try {
recyclerView?.adapter = galleryAdapter
galleryNumberText?.text = "${imageList.size} images"
}
catch(ex:Exception)
{
println(ex.message)
}
}```
GalleryAdapter
class GalleryAdapter(var ctx: Context, var listOfImages:MutableList<String>,var photoListener: ViewHolder.IPhotoInterface): RecyclerView.Adapter<GalleryAdapter.ViewHolder>() {
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
fun GetImageInit(view:View):ImageView =view.findViewById(R.id.imageElement1)
var image : ImageView
init {
image = GetImageInit(itemView) as ImageView
}
interface IPhotoInterface {
fun onPhotoClick(stringPath:String): Unit
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var inflatedView:View = LayoutInflater.from(this.ctx).inflate(R.layout.gallery_fragment,parent,false)
return ViewHolder(inflatedView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
var image:String = (listOfImages as List<String>).get(position)
Glide.with(ctx).load(image).into(holder.image)
holder.itemView.setOnClickListener{view->
this.photoListener.onPhotoClick(image)
}
}
override fun getItemCount(): Int {
return this.listOfImages.size
}
}
```
gallery_fragment
```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".gallery_fragment"
android:background="#333333"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:id="@+id/galleryNumberContainer">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/galleryNumber"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:textColor="@color/white"
android:textStyle="bold"
android:textSize="18dp"
/>
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewImageItems"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</androidx.recyclerview.widget.RecyclerView>
</RelativeLayout>
GalleryItem in a different view file
```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/gallery_item"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:layout_constraintDimensionRatio="1"
android:id="@+id/imageElement1"
tools:ignore="MissingConstraints"
></ImageView>
</androidx.constraintlayout.widget.ConstraintLayout>
我是如何获得图片列表的
kotlin
public fun GetImagesList(context: Context):MutableList<string>{
lateinit var uri:Uri
var cursor:Cursor?
var columnIndexDataId:Int =0
var imageCollectionList:MutableList<string> = mutableListOf<string>()
var projection:Array<string>
var absoluteImagePath:String =""
uri =MediaStore.Images.Media.EXTERNAL_CONTENT_URI
var selection:string = "_id?"
// var selectionArgs :Array<string> = arrayOf(DocumentsContract.getDocumentId(uri).split(":")[1])
try {
val columnName:string="_data"
projection = arrayOf(columnName)
cursor =context.contentResolver.query(uri,null,null,null,null)
//if cursor is not null then execute codeblock
cursor?.let {
while(it.moveToNext())
{
val columnIndex = cursor.getColumnIndexOrThrow(columnName)
absoluteImagePath =cursor.getString(columnIndex)
imageCollectionList.add(absoluteImagePath)
}
}
}
catch (ex:Exception){
print(ex.message)
}
return imageCollectionList
}
【问题讨论】:
-
你的完整*错误信息是什么?
-
@JonR85 再次检查 OP 我已经全部复制了
-
谢谢。 140 是哪一行?
-
@JonR85 galleryAdapter = GalleryAdapter(this.context as Context,imageList, 一旦接触到 get imageElement 就会崩溃
-
@JonR85 显然它在尝试在片段视图中找到元素时崩溃了我应该在片段上添加图像元素还是如何绑定到片段视图?
标签: java android android-studio kotlin