gpt4 book ai didi

Android - 任何 Activity 的 Root View 层次结构中存在的所有 View 的相对路径生成器

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:39 24 4
gpt4 key购买 nike

背景

在 android 布局文件中有很多 UI 元素和 View 组。有时我们不需要为 View 提供 id 值(唯一标识符)。在这种情况下,我们无法通过调用 findViewByid() 找到 View 。因此我们无法操纵它们。

问题是

我们如何为任何 Activity 的所有 View 生成路径,示例如下:

content>LinearLayout-0>RelativeLayout-3>LinearLayout-0>TextView-2

上面一行的意思是

  1. 内容是主要布局
  2. LinearLayout 是最顶层的布局
  3. RelativeLayout-3 是最顶层布局的第三个 child
  4. LinearLayout 是第三个 RelativeLayout 的 child
  5. TexView-2 是 LinearLayout 的子级,而 LinearLayout 是最顶层 LinearLayout 的第三个 RelativeLayout 子级。

所以基本上我正在寻找如下功能:

String path = getViewPath(view);

View view = findViewByPath(path)

用例:

实际上服务器会通过指定 View 路径向移动应用程序广播一些命令,

然后移动应用程序将从路径中找到 View 并更改 View 的属性

最佳答案

在上述问题的解决方案下方,我创建了获取 View 路径和按路径获取 View 的方法。

干杯!!!

    package com.test;

import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.Window;

import java.util.Arrays;


public class CustomViewIdManager {


private static final String ACTIVITY_CLASS_SEPARATOR = "@";
private static final String VIEW_SEPARATOR = ">";
private static final String VIEW_POSITION_SEPARATOR = ":";
private static final String MAIN_CONTENT_LAYOUT_NAME = "content";


/**
* Find given view path in activity hierarchy
*
* @param view
* @param activity
* @return Path given view
*/
public static String generateViewPathInActivityViewHierarchy(View view, Activity activity) {

String path = "";
View currentView = view;
ViewParent currentParent;

do {
currentParent = currentView.getParent();
if (currentView.getId() == Window.ID_ANDROID_CONTENT) {
path = activity.getLocalClassName() + ACTIVITY_CLASS_SEPARATOR + MAIN_CONTENT_LAYOUT_NAME + path;
break;
} else {
path = VIEW_SEPARATOR + currentView.getClass().getSimpleName() + VIEW_POSITION_SEPARATOR + getSelfIndexInParent((View) currentParent, currentView) + path;
}
currentView = (View) currentView.getParent();
} while (true);

return path;
}


/**
* Finding the view by given path in activity view hierarchy
* @param path
* @param activity
* @return
*/
public static View findViewByCustomPath(String path, Activity activity) {

String[] activitySplitting = path.split(ACTIVITY_CLASS_SEPARATOR);
String[] viewSplitting = activitySplitting[1].split(VIEW_SEPARATOR);

View viewLooker = null;

if (viewSplitting[0].equalsIgnoreCase(MAIN_CONTENT_LAYOUT_NAME)) {
viewLooker = ViewUtil.getContentView(activity);
}

return viewFinder(viewLooker, Arrays.copyOfRange(viewSplitting, 1, viewSplitting.length));

}

public static View viewFinder(View view, String[] restPath) {

View viewToSendBack;

String singleView = restPath[0];
String[] viewPositioningSplitting = singleView.split(VIEW_POSITION_SEPARATOR);
viewToSendBack = ((ViewGroup) view).getChildAt(Integer.parseInt(viewPositioningSplitting[1]));

if (restPath.length > 1) {
return viewFinder(viewToSendBack, Arrays.copyOfRange(restPath, 1, restPath.length));
} else {
return viewToSendBack;
}
}


/**
* This will calculate the self position inside view
*
* @param parent
* @param view
* @return index of child
*/
public static int getSelfIndexInParent(View parent, View view) {

int index = -1;
if (parent instanceof ViewGroup) {
ViewGroup viewParent = (ViewGroup) parent;

for (int i = 0; i < viewParent.getChildCount(); ++i) {
View child = viewParent.getChildAt(i);
++index;

if (child == view) {
return index;
}
}
}

return index;
}
}

关于Android - 任何 Activity 的 Root View 层次结构中存在的所有 View 的相对路径生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com