获取指向操作栏上选项卡的 TextView 的指针?

Grabbing a pointer to a TextView of a tab on the action bar?

我和其他一些用户正在为 Stack Exchange 聊天网络开发 Android 应用程序。我们正在为每个 activity 添加教程,以向用户解释 UI。但是,我们 运行 遇到了一些障碍。

教程库需要一个指向视图的指针(无论是 TextViewImageView 还是什么),以便在显示中获取视图的坐标,从而知道在何处绘制阴影和东西。

我们有一个 activity,它使用来自 Android Studio 的标准 "Tabbed Activity",因此 我们没有使用任何自定义工具栏

操作栏如下所示:

并且我们想要在每个包含选项卡标题的选项卡上获取指向 TextView 的指针。

例如,我们希望能够访问这个 Textview:

我们还没有真正成功地在 Internet 上找到有关如何执行此操作的任何信息。如果您使用的是自定义工具栏,它似乎相对容易,但我们不是

深入研究 AOSP 源代码,我们找到了一种可行的方法,但我们需要访问的字段要么 private 要么无法从 activity 主代码访问。

所以问题是,我们如何获取指向 TextView 的指针?有可能吗?

好吧,它并不漂亮,但我们找到了一种方法。使用 Android 设备监视器中的布局检查器查看视图层次结构,我们能够通过以下方式获取指向它的指针。

切记:

  • 您可能需要针对 activity 的布局进行调整

  • 如果您使用自定义工具栏,可以使用更简单的方法

话虽如此,以下是适用于此特定用例的方法:

ViewGroup viewGroup = (ViewGroup) getWindow().getDecorView();
LinearLayout testb = (LinearLayout) viewGroup.getChildAt(0);
FrameLayout testc = (FrameLayout) testb.getChildAt(1);
ActionBarOverlayLayout testd = (ActionBarOverlayLayout) testc.getChildAt(0);
ActionBarContainer teste = (ActionBarContainer) testd.getChildAt(1);

LinearLayoutCompat testg;

if (getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT)
{
    ScrollingTabContainerView testf = (ScrollingTabContainerView) teste.getChildAt(2);
    testg = (LinearLayoutCompat) testf.getChildAt(0);
}
else //Landscape
{
    Toolbar teste2 = (Toolbar) teste.getChildAt(0);
    ScrollingTabContainerView testf = (ScrollingTabContainerView) teste2.getChildAt(0);
    testg = (LinearLayoutCompat) testf.getChildAt(0);
}

testg.setId(android.R.id.tabcontent);

//String IdAsString = testg.getResources().getResourceName(testg.getId());
//Log.e("TestG", IdAsString);

TutorialStuff.chatsExplorationTutorial(this, testg);

这是最终结果: