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 null 对象 mNextAnim 内部崩溃
android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象