Android Fragment - 如何获得“mWho”值?

Posted

技术标签:

【中文标题】Android Fragment - 如何获得“mWho”值?【英文标题】:Android Fragment - how to get the "mWho" value? 【发布时间】:2021-09-20 06:13:19 【问题描述】:

如果打印一个片段:

println("fragment: $Fragment()")

打印出来:

Fragment8d157db (d63150f2-7497-4c04-9214-d20c3ccaba34)

查看toString()的实现,我可以看到:

public String toString() 
    StringBuilder sb = new StringBuilder(128);
    Class<?> cls = getClass();
    sb.append(cls.getSimpleName());
    sb.append("");
    sb.append(Integer.toHexString(System.identityHashCode(this)));
    sb.append("");
    sb.append(" (");
    sb.append(mWho);
    if (mFragmentId != 0) 
        sb.append(" id=0x");
        sb.append(Integer.toHexString(mFragmentId));
    
    if (mTag != null) 
        sb.append(" tag=");
        sb.append(mTag);
    
    sb.append(")");
    return sb.toString();

所以它打印的UUID 来自mWho 变量,它使用以下方法生成:

// Internal unique name for this fragment;
@NonNull
String mWho = UUID.randomUUID().toString();

在使用supportFragmentManager.findFragmentByTag 时,有没有办法让这个值用作tag?在不解析toString 字符串的情况下获取它。

我问这个是因为现在我有自己的自定义 uniqueUUID,我用它来使用retainInstance 恢复片段。如果我能得到mWho,我就不需要我自己的uniqueUUID自定义代码了。

【问题讨论】:

请注意mWho 可能会因配置更改而发生变异 @Zain 当我对片段使用retainInstance 时,据我所知,它并没有改变。 对标签使用特定于实例的标识符是没有意义的。不要对setRetainInstance()感到太舒服:android-review.googlesource.com/c/platform/frameworks/support/+/… “我用于使用retainInstance 恢复片段”是什么意思?你能解释一下你实际上在做什么吗? 片段中的 @ianhanniballake retainInstance 防止它在配置更改(例如方向更改)时被破坏。 ***.com/questions/11182180/… 【参考方案1】:

我能够使用反射和惰性变量来实现这一点:

val who: String by lazy 
    println("Trying to get who!")
    var toReturn = ""
    try 
        println("Fields: $javaClass.superclass.superclass")
        toReturn = javaClass.superclass.superclass.getDeclaredField("mWho").let 
            it.isAccessible = true
            it.get(this)
         as String
     catch (e : Exception) 
        println("Exception getting who: $e")
    
    toReturn

注意superclass.superclass 的使用,因为我把它放在Fragment 的子类中。使用lazy 可以防止每次需要反射时都使用反射,因为该值一旦初始化就不会改变。

【讨论】:

不要使用反射来访问类的私有值——这些是私有的,因为它们不是供您使用的。

以上是关于Android Fragment - 如何获得“mWho”值?的主要内容,如果未能解决你的问题,请参考以下文章

android 在fragment里的怎样实现滑动fragment

Fragment中TabLayout加FragmentViewPager

[Android]Fragment源代码分析 状态

Android Fragment null 对象 mNextAnim 内部崩溃

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

如何从使用 Fragment 的 ViewPager2 获得用户点击?