Android 抓取指向操作栏上选项卡的文本视图的指针?

Android 抓取指向操作栏上选项卡的文本视图的指针?,android,android-actionbar-compat,android-tabbed-activity,Android,Android Actionbar Compat,Android Tabbed Activity,我和其他一些用户正在为Stack Exchange聊天网络开发一个Android应用程序。我们将为每个活动添加一个教程,向用户解释UI。然而,我们遇到了一些障碍 教程库需要一个指向视图的指针(可以是文本视图,图像视图,等等),以便获得显示中视图的坐标,从而知道在何处绘制阴影和其他内容 我们有一个活动使用Android Studio的标准“选项卡式活动”,因此我们不使用任何自定义工具栏 操作栏如下所示: 我们想在每个包含选项卡标题的选项卡上获取一个指向TextView的指针 例如,我们希望能够访

我和其他一些用户正在为Stack Exchange聊天网络开发一个Android应用程序。我们将为每个活动添加一个教程,向用户解释UI。然而,我们遇到了一些障碍

教程库需要一个指向视图的指针(可以是
文本视图
图像视图
,等等),以便获得显示中视图的坐标,从而知道在何处绘制阴影和其他内容

我们有一个活动使用Android Studio的标准“选项卡式活动”,因此我们不使用任何自定义工具栏

操作栏如下所示:

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

例如,我们希望能够访问此
Textview

我们还没有真正成功地在互联网上找到任何关于如何做到这一点的信息。如果您使用的是自定义工具栏,似乎相对容易,但是我们没有

通过深入研究AOSP源代码,我们找到了一种可能的方法,但是我们需要访问的字段不是
private
,就是无法从主活动代码中访问


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

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

记住:

  • 您可能需要调整活动的布局

  • 如果您使用的是自定义工具栏,那么有一种更简单的方法可以实现这一点

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

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);
以下是最终结果:


是的,不太漂亮,而且很脆弱。您考虑使用<代码> FIDVIEWSSETY()/<代码>吗?您可以用大约两行代码替换大部分代码,如果OEM弄乱了
视图
层次结构,那么就不太可能出现中断。@MikeM。你知道,我记得我试过,但我不记得为什么它不起作用。我应该再试一次。。。