获取指向操作栏上选项卡的 TextView 的指针?
Grabbing a pointer to a TextView of a tab on the action bar?
我和其他一些用户正在为 Stack Exchange 聊天网络开发 Android 应用程序。我们正在为每个 activity 添加教程,以向用户解释 UI。但是,我们 运行 遇到了一些障碍。
教程库需要一个指向视图的指针(无论是 TextView
、ImageView
还是什么),以便在显示中获取视图的坐标,从而知道在何处绘制阴影和东西。
我们有一个 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);
这是最终结果:
我和其他一些用户正在为 Stack Exchange 聊天网络开发 Android 应用程序。我们正在为每个 activity 添加教程,以向用户解释 UI。但是,我们 运行 遇到了一些障碍。
教程库需要一个指向视图的指针(无论是 TextView
、ImageView
还是什么),以便在显示中获取视图的坐标,从而知道在何处绘制阴影和东西。
我们有一个 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);
这是最终结果: