将自定义组件小部件动态添加到 Android 中的布局中

Posted

技术标签:

【中文标题】将自定义组件小部件动态添加到 Android 中的布局中【英文标题】:Dynamically add custom component widgets to a layout in Android 【发布时间】:2012-10-23 14:42:55 【问题描述】:

我使用本教程创建了一个自定义复合组件http://www.anotherandroidblog.com/2011/05/26/custom-composite-android-component/

现在我正在尝试使用此组件将其动态添加到片段中的布局中。 我正在使用充气机..

LinearLayout column1 = (LinearLayout) getActivity().findViewById(R.id.linear2);
IdeaWidget idea = (IdeaWidget) inflater.inflate(R.layout.idea_component, column1);

我得到一个错误:

11-02 16:07:25.074: E/AndroidRuntime(883): FATAL EXCEPTION: main
11-02 16:07:25.074: E/AndroidRuntime(883): java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.architter/com.example.architter.MainActivity: java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity

这是代码.. 谢谢!

自定义组件的XML文档***

<?xml version="1.0" encoding="utf-8"?>
<com.example.architter.IdeaWidget 
    xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_
        android:layout_
        android:orientation="vertical"
    >
    <ImageView
        android:id="@+id/image"
        android:layout_
        android:layout_
        android:contentDescription="@string/hello_world"
        ></ImageView>
    <TextView
        android:id="@+id/description"
        android:layout_
        android:layout_
        android:layout_weight="1"
        ></TextView>
    <ImageButton
        android:id="@+id/archthis"
        android:layout_
        android:layout_
        android:contentDescription="@string/hello_world"
        ></ImageButton>
</com.example.architter.IdeaWidget>

自定义组件的Java类***

package com.example.architter;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class IdeaWidget extends LinearLayout 

    private ImageView image;
    private TextView description;
    private ImageButton archthis;

    public IdeaWidget(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    @Override
    protected void onFinishInflate() 
        super.onFinishInflate();
        ((Activity)getContext()).getLayoutInflater().inflate(R.layout.idea_component, this);
        setupViewItems();
    

    private void setupViewItems() 
        description = (TextView) findViewById(R.id.description);
        image = (ImageView) findViewById(R.id.image);
        archthis = (ImageButton) findViewById(R.id.archthis);
    

    public void setDescription(String text) 
        description.setText(text);
    

    public void setImage(String url) 
        Bitmap bitImage = getBitmapFromURL(url);
        image.setImageBitmap(bitImage);
    

    public void setArchthis(ImageButton imgb) 
        archthis = imgb;
    

    public static Bitmap getBitmapFromURL(String src) 
        try 
            Log.e("src",src);
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            Log.e("Bitmap","returned");
            return myBitmap;
         catch (IOException e) 
            e.printStackTrace();
            Log.e("Exception",e.getMessage());
            return null;
        
    

【问题讨论】:

【参考方案1】:

LogCat 指出您正在尝试将 ContextThemeWrapper 对象转换为 Activity 对象,但您不能这样做。这似乎发生在这里:

((Activity)getContext()).getLayoutInflater().inflate(R.layout.idea_component, this);

好消息是您可以通过不同的方式获取 LayoutInflater 的副本:

LayoutInflater.from(this).inflate(R.layout.idea_component, this);

【讨论】:

以上是关于将自定义组件小部件动态添加到 Android 中的布局中的主要内容,如果未能解决你的问题,请参考以下文章

将自定义小部件添加到 Flutter TabBar 的活动选项卡

有没有办法将自定义 QGroupBox 添加到任何小部件/布局?

php 将自定义控件添加到现有Elementor窗口小部件

php DashboardWidgeteinfügen - 将自定义仪表板小部件添加到wordpress

将自定义 QEvent 传播到 Qt/PyQt 中的父小部件

将自定义组件添加到 EXTJS 图表