0

为什么在直接从 xml 膨胀时设置了 fill_parent 时,滚动视图中的线性布局中的某些视图会填充父级,但在通过膨胀相同 xml 的自定义组件添加时却没有?

在两个不同的地方膨胀相同的 xml 的结果:

http://imgur.com/DF6kl

两者中最重要的一项是在扩展 linearLayout 的类中扩展 xml,然后将该类添加到滚动视图内的 linearLayout 中。这个观点没有填满父母,我不知道为什么。

底部项目是直接在包含这一切的活动中扩展 xml 的结果。它看起来如我所料。

这是在活动中添加两个视图的代码:

scrollList.addView(new CommunityTaskListItem(this, null));
scrollList.addView(View.inflate(getBaseContext(), R.layout.communitytask, null));

这是在自定义组件类“CommunityTaskListItem”中扩展活动的代码:

View communityTask = View.inflate(context, R.layout.communitytask, null);
addView(communityTask);

我认为 xml 没问题,因为直接在活动中膨胀时它可以正常工作。我的问题是为什么当 xml 在自定义组件的类中膨胀时,fill_parent 属性似乎丢失了?

为了更好的衡量,这里是被夸大的 xml: 编辑:我之前给了你错误的!这是正确的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</LinearLayout>

如果可以的话,我想保留自定义组件,而不是在我的活动中膨胀 xml。

编辑: CommunityTaskListItem 被夸大的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CommunityTaskListItem extends LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        View communityTask = View.inflate(context, R.layout.communitytask, null);
        addView(communityTask);

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);

    }
...

编辑:现在一切正常!这是其他人的最终代码,以防他们遇到类似问题:自定义对象的构造函数:

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(VERTICAL);
        addView(inflate(context, R.layout.communitytask, null));

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription =     (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

自定义对象 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</LinearLayout>

老实说,我不知道我到底犯了什么错误,所以如果有人能说清楚,我将非常感激。

4

1 回答 1

2

第一行应该是:

scrollList.addView(new CommunityTaskListItem(this, null)
    new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

您在类inflate()内部调用CommunityTaskListItem,膨胀视图成为视图的子CommunityTaskListItem视图。但是您没有为此视图设置宽度和高度,因此它与父级的宽度不匹配。

编辑:我认为你的 XML 应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<packagename.CommunityTaskListItem
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</packagename.CommunityTaskListItem>

其中packagenameCommunityTaskListItem类的包的名称。

在这种情况下,您应该更改CommunityTaskListItem

public class CommunityTaskListItem extends LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

    // ....
}

无法使用其构造函数创建此类。它只能膨胀。

第二种方法是像你一样在构造函数中膨胀孩子。但 XML 应该不同:

<?xml version="1.0" encoding="utf-8"?>
<merge
  xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1" android:background="@drawable/plainbutton" android:layout_marginBottom="5px" android:layout_marginTop="5px" android:layout_weight="1">
        <TextView android:layout_height="wrap_content" style="@style/CommunityTaskText" android:layout_width="fill_parent" android:layout_weight="1" android:id="@+id/textViewCommunityTaskTimes" android:text="xx:xx - xx:xx"></TextView>
        <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" style="@style/CommunityTaskText" android:id="@+id/textViewCommunityTaskDescription" android:text="Task"></TextView>
    </LinearLayout>

</merge>

CommunityTaskListItem是:公共类 CommunityTaskListItem 扩展 LinearLayout {

    TextView textViewCommunityTaskTimes;
    TextView textViewCommunityTaskDescription;

    public CommunityTaskListItem(Context context) {
        this(context, null);
    }

    public CommunityTaskListItem(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(VERTICAL);
        inflate(context, R.layout.communitytask);

        textViewCommunityTaskTimes = (TextView)findViewById(R.id.textViewCommunityTaskTimes);
        textViewCommunityTaskDescription = (TextView)findViewById(R.id.textViewCommunityTaskDescription);
    }

    // ....
}

此类可以使用其构造函数创建并从 XML 扩展。但是如果你想对它进行膨胀,你应该创建一个单独的 XML 文件。让我们称之为task.xml

<?xml version="1.0" encoding="utf-8"?>
<packagename.CommunityTaskListItem
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content"/>

这就是你可以使用它的方式:

scrollList.addView(new CommunityTaskListItem(this),
    new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
scrollList.addView(View.inflate(getBaseContext(), R.layout.task, null));
于 2011-09-11T11:07:46.840 回答