使用FrameLayout和TextView创建自定义ImageButton类

时间:2011-10-29 05:10:19

标签: java android

我是新手,所以,任何帮助都表示赞赏。我在StackOverflow上阅读了很多帖子,我也在谷歌搜索了我的疑问,但很难找到一个好的答案。

以下是我要做的事情:

    <FrameLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">    
    <ImageButton 
        android:background="@layout/roundcorners" 
        android:id="@+id/hug" 
        android:scaleType="centerInside"
        android:cropToPadding="false"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingBottom="10dip"
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent"
        android:src="@drawable/hug">
    </ImageButton>
    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="bottom|center"
        android:textColor="#000000"
        android:textSize="15dip"
        android:textStyle="bold"
        android:paddingBottom="5dip"
        android:clickable="true" 
        android:text="Hug">
    </TextView>
</FrameLayout>

上面你们可以看到我需要的XML版本。

重点是......我将在运行时拥有许多这些FrameLayouts。填写按钮的每个信息都来自数据库。

所以,我需要创建一个Java类,我可以在我的数据库中使用循环遍历所有寄存器并实例化一个新的FrameLayout类(这个类必须有一个ImageButton和一个TextView,你可以从上面的XML中看到)和只需传递参数,如下:

for (int i = 0; i < mArray.length; i++) {
        button = new MyNewImageButton(name, src, text);
}

以上只是为了简化。我的意思是,在创建我计划创建的此类的实例时,我将从数据库传递参数。当然,创建的每个按钮都会添加到布局中。

所以...我的问题是:我知道如何使用XML来做到这一点,但我真的很难创建一个类来执行此操作。

有什么想法?任何帮助都表示赞赏。

P.S。:对不起,如果我的英语出错了,好吗?我是巴西人。总有一天,我的英语将完美无瑕!对不起,如果这个问题已经回答了。


很抱歉回答我自己的问题,提出另一个问题。我试着使用评论,但是字符数有限制,所以,我真的很抱歉。

嘿伙计们和@blessenm。好吧......我尝试使用inflater,我想出了以下代码:

    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);  
    // ******************************************* 
    setContentView(R.layout.main);      


    //this is my main screen
    //it's a linearlayout vertical orientation
    ViewGroup parent = (ViewGroup) findViewById(R.id.tela_principal);

    //these two new LinearLayouts will be one above the other, 
    //just like two lines
    LinearLayout l1 = new LinearLayout(this);
    LinearLayout l2 = new LinearLayout(this);

    //inside of each linearlayout I set the orientation to horizontal
    //so, everytime a picture is inflated from xml, it will fill in one
    //linearlayout
    l1.setOrientation(LinearLayout.HORIZONTAL);
    l2.setOrientation(LinearLayout.HORIZONTAL);

    //setting linearlayout parameters, so they fill the whole screen
    l1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    l2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));


    //the first two inflated xml imagebuttons I add to LinearView1
    view = LayoutInflater.from(getBaseContext()).inflate(R.layout.figurabotao,
            l1, true);
    view = LayoutInflater.from(getBaseContext()).inflate(R.layout.figurabotao,
            l1, true);

    //the next two inflated xml imagebuttons I add to LinearView2
    view = LayoutInflater.from(getBaseContext()).inflate(R.layout.figurabotao,
            l2, true);
    view = LayoutInflater.from(getBaseContext()).inflate(R.layout.figurabotao,
            l2, true);

    //after the above, we should have a grid 2X2


    //after linearlayouts are filled, I add them to the main screen
    parent.addView(l1, new LinearLayout.LayoutParams(0, 0, 1));
    parent.addView(l2, new LinearLayout.LayoutParams(0, 0, 1));

然而这不起作用。在错误日志中,我收到以下消息:

“未处理的事件循环异常”。

关于我做错了什么的想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您只是尝试从xml创建视图并将其添加到布局中。只需使用LayoutInflater。

在活动内部使用类似

的内容
FrameLayout frame = (FrameLayout)getLayoutInfalter.inflate(
        R.id.YOUR_VIEW_XML,null);
layout.addView(frame);

如果您尝试创建类,请扩展框架布局或视图。创建一个构造函数,它接受您的参数并指定所需的值。

编辑: 内部的Acess元素 如果您已将id设置为这些元素,则可以通过

访问它们
TextView text = (TextView)frame.findViewById(R.id.yourtextview);

或者您可以使用像

这样的子索引
TextView text = (TextView)frame.getChildAt(0);

答案 1 :(得分:0)

听起来你正在寻找一种方法来创建一个视图类,它将是一个ImageButton和一个用FrameLayout包装的TextView。

在这种情况下,您可以考虑创建自己的View类。可能是一个扩展FrameLayout的View类。有关如何创建自定义视图的详细信息,请参阅此开发文章。 http://developer.android.com/guide/topics/ui/custom-components.html

特别是“复合控制”部分:http://developer.android.com/guide/topics/ui/custom-components.html#compound