4

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

教程库需要一个指向视图的指针(可以是TextView, ImageView, 等等),以便获取视图在显示中的坐标,以便知道在哪里绘制阴影和其他东西。

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

操作栏如下所示:

在此处输入图像描述

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

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

在此处输入图像描述

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

通过挖掘 AOSP 源代码,我们找到了一种可行的方法,但是我们需要访问的字段要么private无法从主活动代码访问,要么无法访问。

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

4

1 回答 1

6

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

记住:

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

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

话虽这么说,以下是适用于这个特定用例的方法:

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);

这是最终结果:

在此处输入图像描述

于 2017-10-13T14:23:30.223 回答