我在理解复合组件的工作原理时遇到了问题。
所以我想创建一个包含更多组件的组件。如果我通过 <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_width
和layout_height
属性。我还有很多
我想以编程方式在构造函数中创建它们
试过。但它不起作用,android抛出You must supply a
layout_width attribute
。在上面的示例中,我通过xml添加了元素,我可以添加那些参数,但是当我通过new创建组件并将其添加到另一个视图时会发生什么?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
添加设置为inflate
和this
,但它不起作用。我猜这与layout_width
和layout_height
不起作用的原因相同。如何将这些属性设置为组件“LinearLayout
?非常感谢任何形式的帮助!
致以最诚挚的问候,