可以在 Android 布局 XML 中传递 Class<> 对象吗?

Posted

技术标签:

【中文标题】可以在 Android 布局 XML 中传递 Class<> 对象吗?【英文标题】:It is possible to pass a Class<> object in Android Layout XML? 【发布时间】:2014-11-20 11:25:02 【问题描述】:

我正在构建一个自定义视图,该视图需要一个实体的 Class 对象作为其属性之一。虽然我通过为其添加一个 Setter 使其以编程方式工作,但我想知道是否有任何好的方法可以将其添加到 XML 以进行布局?

“类”类型的样式似乎没有格式选项。我可以使用字符串,但我不得不赌该值实际上是一个有效的类,并且我会失去类型提示,所以它并不理想。

有什么好的方法可以使这项工作,还是我应该坚持以编程方式设置它?

【问题讨论】:

【参考方案1】:

方法一(有警告):

通用自定义视图:

public class CustomView<T> extends View 

    private List<T> typedList = new ArrayList<T>();
    
    public CustomView(Context context) 
        this(context, null);
    

    public CustomView(Context context, AttributeSet attrs) 
        this(context, attrs, 0);
    

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    
    
    public void addTypedValue(T object)
        typedList.add(object);
    
    
    public T getTypedValue(int position)
        return typedList.get(position);
    

活动:

//unsafe cast!
CustomView<String> customViewGeneric = (CustomView<String>) findViewById(R.id.customView);  
customViewGeneric.addTypedValue("Test");
String test = customViewGeneric.getTypedValue(0);

XML:

<org.neotech.test.CustomView
    android:id="@+id/customView"
    android:layout_
    android:layout_ />

方法2(无警告,安全!):

此方法使用通用的 CustomView。对于将在 xml 中使用的每种类型,您都需要创建一个特定的类。

我添加了一个示例实现:

Generic CustomView:(不要在 xml 中夸大这个):

public class CustomView<T> extends View 

    private List<T> typedList = new ArrayList<T>();
    
    public CustomView(Context context) 
        this(context, null);
    

    public CustomView(Context context, AttributeSet attrs) 
        this(context, attrs, 0);
    

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    
    
    public void addTypedValue(T object)
        typedList.add(object);
    
    
    public T getTypedValue(int position)
        return typedList.get(position);
    

String 类型的 XML 充气视图:

public class CustomViewString extends CustomView<String> 
    
    //ADD Constructors!
    

Integer 类型的 XML 充气视图:

public class CustomViewInteger extends CustomView<Integer> 
    
    //ADD Constructors!
    

活动:

CustomViewString customViewString = (CustomViewString) findViewById(R.id.customViewString);
CustomView<String> customViewGeneric = customViewString;

XML:

<org.neotech.test.CustomViewString
    android:id="@+id/customViewString"
    android:layout_
    android:layout_ />

<org.neotech.test.CustomViewInteger
    android:id="@+id/customViewInteger"
    android:layout_
    android:layout_ />

【讨论】:

以上是关于可以在 Android 布局 XML 中传递 Class<> 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

在Android中,如何将数据从类传递到相应的布局/片段文件?

将值传递给布局文件

是否可以在 XML 中传递构造函数参数?

自定义字体和 XML 布局 (Android)

在布局 XML 中编辑 android:tag

我可以在Android布局xml文件中定义中间行的文本