相当于Android视图的CSS类选择器?

Posted

技术标签:

【中文标题】相当于Android视图的CSS类选择器?【英文标题】:Equivalent of CSS class selectors for Android views? 【发布时间】:2013-07-19 13:04:26 【问题描述】:

android 视图是否具有与 CSS 类选择器等效的功能?类似 R.id 但可用于多个视图的东西?我想隐藏一些独立于它们在布局树中的位置的视图组。

【问题讨论】:

【参考方案1】:

我认为您需要遍历布局中的所有视图,寻找所需的 android:id。然后,您可以使用 View setVisibility() 来更改可见性。您还可以使用 View setTag() / getTag() 而不是 android:id 来标记您要处理的视图。例如,以下代码使用通用方法来遍历布局:

// Get the top view in the layout.
final View root = getWindow().getDecorView().findViewById(android.R.id.content);

// Create a "view handler" that will hide a given view.
final ViewHandler setViewGone = new ViewHandler() 
    public void process(View v) 
        // Log.d("ViewHandler.process", v.getClass().toString());
        v.setVisibility(View.GONE);
    
;

// Hide any view in the layout whose Id equals R.id.textView1.
findViewsById(root, R.id.textView1, setViewGone);


/**
 * Simple "view handler" interface that we can pass into a Java method.
 */
public interface ViewHandler 
    public void process(View v);


/**
 * Recursively descends the layout hierarchy starting at the specified view. The viewHandler's
 * process() method is invoked on any view that matches the specified Id.
 */
public static void findViewsById(View v, int id, ViewHandler viewHandler) 
    if (v.getId() == id) 
        viewHandler.process(v);
    
    if (v instanceof ViewGroup) 
        final ViewGroup vg = (ViewGroup) v;
        for (int i = 0; i < vg.getChildCount(); i++) 
            findViewsById(vg.getChildAt(i), id, viewHandler);
        
    

【讨论】:

【参考方案2】:

您可以为所有此类视图设置相同的标签,然后您可以使用这样的简单函数获取具有该标签的所有视图:

private static ArrayList<View> getViewsByTag(ViewGroup root, String tag)
    ArrayList<View> views = new ArrayList<View>();
    final int childCount = root.getChildCount();
    for (int i = 0; i < childCount; i++) 
        final View child = root.getChildAt(i);
        if (child instanceof ViewGroup) 
            views.addAll(getViewsByTag((ViewGroup) child, tag));
        

        final Object tagObj = child.getTag();
        if (tagObj != null && tagObj.equals(tag)) 
            views.add(child);
        

    
    return views;

如 Shlomi Schwartz answer 中所述。显然这不如 css 类有用。但与编写代码来一次又一次地迭代视图相比,这可能有点用处。

【讨论】:

以上是关于相当于Android视图的CSS类选择器?的主要内容,如果未能解决你的问题,请参考以下文章

2018/1/1 Html+CSS+JavaScript

CSS 子选择器性能与类膨胀

/deep/ 深度作用选择器作用及使用

详解CSS样式选择器都有哪些?

前端基础css 选择器

css都有哪些选择器