Scrollview仅在相对布局中不起作用

时间:2016-04-23 12:03:36

标签: android android-layout layout android-linearlayout android-relativelayout

我在android中创建自定义视图(我想用Java代码动态创建)。我将相对布局扩展到该类。当我使用滚动视图进行此相对布局时,它不起作用(不滚动并只显示相对布局中的一个按钮)。

但是当我将相对布局更改为线性布局并将线性布局方向设置为垂直时,它可以工作,我可以滚动布局。

这是自定义布局类:

import android.content.Context;
import android.graphics.Color;
import android.widget.Button;
import android.widget.RelativeLayout;

import java.util.ArrayList;

public class CustomLayout extends RelativeLayout {

public static ArrayList<Button> btnList;
int btnHeight = pxFromDp(getContext(), 70);

public CustomLayout(Context context) {
    super(context);
    LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    setLayoutParams(params);

    //setOrientation(VERTICAL);  ---> for LinearLayout

    btnList = new ArrayList<>();
}

public void addButton(String buttonText, int id) {
    Button btn = new Button(getContext());

    if(id > 0)
        btn.setY(btnList.get(id - 1).getBottom());
    else
        btn.setY(0);

    btn.setText(buttonText);
    btn.setBackgroundColor(Color.GRAY);
    btnList.add(btn);
    addView(btnList.get(id), id,new LayoutParams(LayoutParams.MATCH_PARENT, btnHeight));
}

//just convert dpi to pixel
public static int pxFromDp(final Context context, float dp) {
    return (int) (dp * context.getResources().getDisplayMetrics().density);
    }
}

这是我使用滚动视图的这个类的用法:

import android.app.Activity;
import android.os.Bundle;
import android.widget.ScrollView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    CustomLayout csLayout = new CustomLayout(this);
    for (int i = 0 ; i < 20 ; i++) {
        csLayout.addButton("Button " + i, i);
    }

    ScrollView sv = new ScrollView(this);
    sv.addView(csLayout);

    setContentView(sv);
}
}

请记住,此自定义视图适用于扩展线性布局。

我该怎样做才能为相对布局工作?

2 个答案:

答案 0 :(得分:2)

要在RelativeLayout中使用视图,您必须指定一些其他属性,例如

android:layout_below="id"
android:layout_above ="id"
android:layout_toRightOf="id"
android:layout_toLeftOf="id"

视图在上方,左右下方(相对)。

正如你在LinearLayout上所说的那样它工作得很好,因为你已经给出了线性布局的垂直方向,这意味着无论何时向它添加任何元素,它都会自动低于最后添加的项目。这就是为什么你能够通过LinearLayout看到所需的功能。

另外,正如@Devendra Singh之前所建议的那样,你应该确保只有一个直接子节点到那个ScrollView。

您的RelativeLayout中发生的是,绘制了所有按钮,但它们是相互重叠绘制的。这就是为什么你只看到一个出现在屏幕上的原因。如果要调试,请尝试在添加的按钮上设置文本,并根据for循环给它一个数字。您将看到显示的按钮是添加的最后一个按钮。

我希望这有助于......快乐的编码!!!

答案 1 :(得分:1)

因为ScrollView只能托管一个直接子布局。并且您附加了多个。最好将Relativelayout添加到LinearLayout 更好的文档Here

最好将LinearLayout和按钮添加到Linearlayout,然后将线性布局添加到CustomLayout。就像

ScrollView sv = new ScrollView(this);
    sv.setFillViewport(true);
    CustomLayout customLayout = new CustomLayout(this);
    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);

    for (int i = 0; i < 20; i++) {
        Button button = new Button(this);
        button.setText("Button" + i);
        linearLayout.addView(button);
    }
    customLayout.addView(linearLayout);
    sv.addView(customLayout);
    setContentView(sv);

但最好使用xml准确地获取布局。