以编程方式设置自定义复合组件布局参数?

时间:2016-12-14 23:45:30

标签: android android-custom-view

我在理解复合组件的工作原理时遇到了问题。 所以我想创建一个包含更多组件的组件。如果我通过 <include 标记添加一些布局,它应该类似。我不能使用include的原因是:我想添加一些逻辑来实现ComponentClass和我需要以编程方式添加id 。让我们跳转到代码:我删除了所有冗余,并留下了基础知识。在这里,我通过main_layout.xml放置了组件,但我需要以programmaticaly方式创建它。

main_layout.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android">
   <my.package.AjaxLoader/>
</RelativeLayout>

ajax_loader.xml (我的组件):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/grey">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height"wrap_content"
        android:text="Label" />
</LinearLayout>

AjaxLoader.java

// Is LinearLayout root layout of component? What about inflated layout root component?
public class AjaxLoader extends LinearLayout {

    public AjaxLoader(Context context) { this(context, null, 0);    }

    public AjaxLoader(Context context, AttributeSet attrs) { this(context, attrs, 0);}

    public AjaxLoader(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        View inflate = LayoutInflater.from(context).inflate(R.layout.ajax_loader, this, true);
        /* Parent component is Relative layout( in main_layout.xml) so we use RelativeLayout.LayoutParams*/
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
             ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
        setLayoutParams(layoutParams); // should I call this??
        inflate.setLayoutParams(layoutParams); // or this??? 
        // anyway both do not work :(
   }
}

我有几个问题:

  • 所以如果你注意到我的主要布局中有<my.package.AjaxLoader/>。 由于AjaxLoader扩展LinearLayout,因此必须具有此功能 layout_widthlayout_height属性。我还有很多 我想以编程方式在构造函数中创建它们 试过。但它不起作用,android抛出You must supply a layout_width attribute。在上面的示例中,我通过xml添加了元素,我可以添加那些参数,但是当我通过new创建组件并将其添加到另一个视图时会发生什么?
  • android创建了什么结构?我AjaxLoader.java延长了LinearLayout,我用另一个LinearLayout给它充气。是否意味着它会生成LinearLayout - &gt; LinearLayout2 - &gt; TextView?如果我以merge的根目标实施ajax_loader.xml,则会生成LinearLayout - &gt; TextView?我只需要LinearLayout - &gt; TextView。我应该像<merge中一样使用ajax_loader.xml并将所有的layour属性放在我的AjaxLoader课程中吗?或者我应该使用LinearLayout作为根元素ajax_loader.xml并在那里移动所有布局属性?
  • 我很难将这个元素放在屏幕的中心。我将RelativeLayout作为父元素(在main_layout.xml中)。如果我加 android:layout_centerHorizontal="true"android:layout_centerVertical="true"到xml组件(在main_layout.xml中)它会根据我的需要转到屏幕的中心。但请记住,我想以programmaticaly方式创建它。所以我创建了RelativeLayout.LayoutParams layoutParams添加设置为inflatethis,但它不起作用。我猜这与layout_widthlayout_height不起作用的原因相同。如何将这些属性设置为组件“LinearLayout
  • 还有关于android复合组件的好文章吗?我看了developer.androidvogella,但我仍无法弄清楚发生了什么。

非常感谢任何形式的帮助!

致以最诚挚的问候,

0 个答案:

没有答案