android片段-如何获取“mwho”值?

sq1bmfud  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(311)

如果打印片段: println("fragment: ${Fragment()}") 它打印出: Fragment{8d157db} (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();

是否有方法获取此值以用作 tag 使用时 supportFragmentManager.findFragmentByTag ? 无需解析 toString 一串
我这样问是因为现在我有自己的自定义uniqueuuid,用于使用 retainInstance . 如果我能拿到 mWho ,我不需要为uniqueuuid使用自己的自定义代码。

xhv8bpkk

xhv8bpkk1#

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

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 防止每次需要反射时使用反射,因为该值在初始化后不会更改。

相关问题