Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments 如何在片段中实现GlideApp?_Android Fragments_Kotlin_Android Glide - Fatal编程技术网

Android fragments 如何在片段中实现GlideApp?

Android fragments 如何在片段中实现GlideApp?,android-fragments,kotlin,android-glide,Android Fragments,Kotlin,Android Glide,我正试图用kotlin从Firebase存储的碎片中获取一张照片,但它就是不起作用。代码如下: val data = FirebaseStorage.getInstance() val storageRef = data.getReference() val pathReference = storageRef.child(user.uid.toString() + "/images/coverphoto/") GlideApp.with(context) .load(pathRef

我正试图用kotlin从Firebase存储的碎片中获取一张照片,但它就是不起作用。代码如下:

val data = FirebaseStorage.getInstance()
val storageRef = data.getReference()
val pathReference = storageRef.child(user.uid.toString() + "/images/coverphoto/")

GlideApp.with(context)
     .load(pathReference)
     .into(view.profileUserCoverPhoto)
这给了我一个错误:
Required:Context-Found:Context?

我还尝试了
GlideApp.with(this@Profile)
GlideApp.with(view.context)
(我将我的视图膨胀为
视图
,这就是我尝试的原因。我不知道上下文应该是什么,我相信这就是问题所在。图像上传到Firebase很好,所以我知道它就在那里。我相信错误在于我的滑动代码。特别是
上下文
部分代码,但我不知道我在做什么。)或我应该使用的。任何帮助都将不胜感激

*****更新*****

我刚刚用一个来自web的URL测试了Glide,它运行得很好。我还用firebase URL测试了图像“”,效果也很好。我已经检查了我的路径引用,它正在正确构建


这令人困惑和沮丧。我已经试着找出解决方案3天了。我不知道我做错了什么…

您的编译错误:

必需:找到上下文:上下文

是由于Fragment.getContext()方法被注释为@Nullable。如果未附加该片段,它将返回null

context?.let { // If context is not null use it in the passed block as `it`
    GlideApp.with(it)
         .load(pathReference)
         .into(view.profileUserCoverPhoto) 
}

请参阅:或操作6.1中的Kotlin在Kotlin中,数据类型可以为null或不可为null。要标记为null,请使用问号。 这是不可为空的

var c: Context // Equivalent to @NonNullable Context c;
这是可以为空的

var c: Context? // Equivalent to @Nullable Context c;
现在,你的GlideApp需要一个不可为null的上下文。但是,你的fragments getContext方法可以返回null。所以,让我们看看这个方法

  /**
    * Return the {@link Context} this fragment is currently associated with.
    *
    * @see #requireContext()
    */
    @Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }

    @Nullable
    final public FragmentActivity getActivity() {
        return mHost == null ? null : (FragmentActivity) mHost.getActivity();
    }
因此,当片段未附加到活动时,可以得到null。基本上,可以确保片段的onAttach和onDetach方法之间的上下文不为null

因此,在onCreate中,您可以使用非空断言

GlideApp.with(getContext()!!)
否则,您可以始终检查上述答案中提到的空值

getContext()?.let{ GlideApp.with(it) ... }  

终于!!我解决了问题:

我的requiredAppGlideModule.kt不正确。kotlin应该是这样的:

import android.content.Context
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.module.AppGlideModule
import com.google.firebase.storage.StorageReference
import com.bumptech.glide.Glide
import com.bumptech.glide.Registry
import com.firebase.ui.storage.images.FirebaseImageLoader
import java.io.InputStream
import com.google.firebase.FirebaseOptions.Builder



@GlideModule
class RequiredAppGlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        // Register FirebaseImageLoader to handle StorageReference
        registry.append(StorageReference::class.java, InputStream::class.java,
                FirebaseImageLoader.Factory())
    }
}
一旦我这样做并在上面添加了所有正确的导入引用,我就得到了
FirebaseImageLoader
的未知引用错误,因此我还使用以下代码创建了一个FirebaseImageLoader.kt类:

package com.firebase.ui.storage.images

import android.util.Log    
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.Key
import com.bumptech.glide.load.Options
import com.bumptech.glide.load.data.DataFetcher
import com.bumptech.glide.load.model.ModelLoader
import com.bumptech.glide.load.model.ModelLoaderFactory
import com.bumptech.glide.load.model.MultiModelLoaderFactory
import com.google.android.gms.tasks.OnFailureListener
import com.google.android.gms.tasks.OnSuccessListener
import com.google.firebase.storage.StorageReference
import com.google.firebase.storage.StreamDownloadTask

import java.io.IOException
import java.io.InputStream
import java.nio.charset.Charset
import java.security.MessageDigest

/**
 * ModelLoader implementation to download images from FirebaseStorage with Glide.
 *
 *
 *
 * First, register this class in your AppGlideModule:
 * <pre>
 * @Override
 * public void registerComponents(Context context, Registry registry) {
 * // Register FirebaseImageLoader to handle StorageReference
 * registry.append(StorageReference.class, InputStream.class,
 * new FirebaseImageLoader.Factory());
 * }
</pre> *
 *
 *
 *
 * Then load a StorageReference into an ImageView.
 * <pre>
 * StorageReference ref = FirebaseStorage.getInstance().getReference().child("myimage");
 * ImageView iv = (ImageView) findViewById(R.id.my_image_view);
 *
 * GlideApp.with(this)
 * .load(ref)
 * .into(iv);
</pre> *
 */
class FirebaseImageLoader : ModelLoader<StorageReference, InputStream> {


    /**
     * Factory to create [FirebaseImageLoader].
     */
    class Factory : ModelLoaderFactory<StorageReference, InputStream> {

        override fun build(factory: MultiModelLoaderFactory): ModelLoader<StorageReference, InputStream> {
            return FirebaseImageLoader()
        }

        override fun teardown() {
            // No-op
        }
    }

    override fun buildLoadData(reference: StorageReference,
                               height: Int,
                               width: Int,
                               options: Options): ModelLoader.LoadData<InputStream>? {
        return ModelLoader.LoadData(
                FirebaseStorageKey(reference),
                FirebaseStorageFetcher(reference))
    }

    override fun handles(reference: StorageReference): Boolean {
        return true
    }

    private class FirebaseStorageKey(private val mRef: StorageReference) : Key {

        override fun updateDiskCacheKey(digest: MessageDigest) {
            digest.update(mRef.path.toByteArray(Charset.defaultCharset()))
        }
    }

    private class FirebaseStorageFetcher(private val mRef: StorageReference) : DataFetcher<InputStream> {
        private var mStreamTask: StreamDownloadTask? = null
        private var mInputStream: InputStream? = null

        override fun loadData(priority: Priority,
                              callback: DataFetcher.DataCallback<in InputStream>) {
            mStreamTask = mRef.stream
            mStreamTask!!
                    .addOnSuccessListener { snapshot ->
                        mInputStream = snapshot.stream
                        callback.onDataReady(mInputStream)
                    }
                    .addOnFailureListener { e -> callback.onLoadFailed(e) }
        }

        override fun cleanup() {
            // Close stream if possible
            if (mInputStream != null) {
                try {
                    mInputStream!!.close()
                    mInputStream = null
                } catch (e: IOException) {
                    Log.w(TAG, "Could not close stream", e)
                }

            }
        }

        override fun cancel() {
            // Cancel task if possible
            if (mStreamTask != null && mStreamTask!!.isInProgress) {
                mStreamTask!!.cancel()
            }
        }

        override fun getDataClass(): Class<InputStream> {
            return InputStream::class.java
        }

        override fun getDataSource(): DataSource {
            return DataSource.REMOTE
        }
    }

    companion object {

        private val TAG = "FirebaseImageLoader"
    }
}
包com.firebase.ui.storage.images
导入android.util.Log
导入com.bumptech.glide.Priority
导入com.bumptech.glide.load.DataSource
导入com.bumptech.glide.load.Key
导入com.bumptech.glide.load.Options
导入com.bumptech.glide.load.data.DataFetcher
导入com.bumptech.glide.load.model.ModelLoader
导入com.bumptech.glide.load.model.ModelLoaderFactory
导入com.bumptech.glide.load.model.multipleLoaderFactory
导入com.google.android.gms.tasks.OnFailureListener
导入com.google.android.gms.tasks.OnSuccessListener
导入com.google.firebase.storage.StorageReference
导入com.google.firebase.storage.StreamDownloadTask
导入java.io.IOException
导入java.io.InputStream
导入java.nio.charset.charset
导入java.security.MessageDigest
/**
*ModelLoader实现使用Glide从FirebaseStorage下载图像。
*
*
*
*首先,在AppGlideModule中注册此类:
* 
*@覆盖
*公共无效注册表组件(上下文上下文、注册表){
*//注册FirebaseImageLoader以处理StorageReference
*registry.append(StorageReference.class、InputStream.class、,
*新的FirebaseImageLoader.Factory());
* }
*
*
*
*
*然后将StorageReference加载到ImageView中。
* 
*StorageReference ref=FirebaseStorage.getInstance().getReference().child(“myimage”);
*ImageView iv=(ImageView)findViewById(R.id.my_image_view);
*
*GlideApp.with(这个)
*.负载(参考)
*。加入第(iv)款;
*
*/
类FirebaseImageLoader:ModelLoader{
/**
*要创建[FirebaseImageLoader]的工厂。
*/
类工厂:ModelLoaderFactory{
覆盖有趣的构建(工厂:MultimultivelLoaderFactory):ModelLoader{
返回FirebaseImageLoader()
}
覆盖有趣的拆卸(){
//无操作
}
}
覆盖buildLoadData(参考:StorageReference,
高度:Int,
宽度:Int,
选项:选项):ModelLoader.LoadData{
返回ModelLoader.LoadData(
FirebaseStorageKey(参考),
FirebaseStorageFetcher(参考))
}
覆盖有趣的句柄(引用:StorageReference):布尔值{
返回真值
}
私有类FirebaseStorageKey(私有val mRef:StorageReference):密钥{
重写fun updateDiskCacheKey(摘要:MessageDigest){
digest.update(mRef.path.toByteArray(Charset.defaultCharset()))
}
}
私有类FirebaseStorageFetcher(私有值mRef:StorageReference):DataFetcher{
私有变量mStreamTask:StreamDownloadTask?=null
私有变量mInputStream:InputStream?=null
覆盖乐趣加载数据(优先级:优先级,
回调:DataFetcher.DataCallback){
mStreamTask=mRef.stream
mStreamTask!!
.addOnSuccessListener{snapshot->
mInputStream=snapshot.stream
callback.onDataReady(mInputStream)
}
.addOnFailureListener{e->callback.onLoadFailed(e)}
}
覆盖乐趣清理(){
//如果可能的话,关闭流程
if(mInputStream!=null){
试一试{
mInputStream!!.close()
mInputStream=null
}捕获(e:IOException){
Log.w(标记“无法关闭流”,e)
}
}
}
覆盖乐趣取消(){
//取消任务