1

我正在尝试创建一个自定义视图,它允许我添加图像和文本。我这样做的原因是因为在我正在创建的应用程序中,我一遍又一遍地重复相同的代码以实现这一点,我想尝试将其包装到自己的自定义视图中,这样我就可以使用设置器和位置相对于彼此的视图,将所有这些代码放在一个简单易用的类中。

我可以将文本视图和图像视图添加到视图中,但是当我尝试将它们彼此相对定位时,我总是会遇到 NPE 崩溃。

这是我到目前为止的代码,它只是添加了一个 TextView,然后尝试在我的自定义视图中将 TextView 居中。

public class MultiView extends RelativeLayout {
    Context cx;
    int images = 0;

    public MultiView(Context context) {

        super(context);
        cx = context;
    }

    public void addText(String textParam) {

        TextView tv = new TextView(cx);

        tv.setText(textParam);

        tv.setTextColor(Color.WHITE);

        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv
                .getLayoutParams();

        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

//      tv.setLayoutParams(layoutParams); // the app crashes when I add this line

        this.addView(tv);
    }

}
4

3 回答 3

2

全班:

public class MultiView extends RelativeLayout {
    Context cx;
    int images = 0;

    public MultiView(Context context) {

        super(context);
        cx = context;
    }

    public void addText(String textParam) {

        RelativeLayout.LayoutParams layoutParams = 
        new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT,      
            RelativeLayout.LayoutParams.WRAP_CONTENT);


        TextView tv = new TextView(cx);
        tv.setText(textParam);
        tv.setTextColor(Color.WHITE);
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        tv.setLayoutParams(layoutParams);
        this.addView(tv);
    }

}
于 2013-10-31T20:40:48.830 回答
1

你在那条线上崩溃是很奇怪的:

tv.setLayoutParams(layoutParams);

我认为你在这条线上得到了它,因为创建的 View 没有任何 LayoutParams(此外,如果它是 RelativeLayout.LayoutParams):

layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

我认为您可以通过 DevBytes 的此视频改进 addText() 方法: http ://www.youtube.com/watch?v=55wLsaWpQ4g

但是如果你想让你的代码工作,你需要像这样替换你的步骤:

TextView tv = new TextView(cx);
tv.setText(textParam);
tv.setTextColor(Color.WHITE);
this.addView(tv); // Programatically created View get LayoutParams when we add it to a ViewGroup

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
tv.setLayoutParams(layoutParams);

或自行创建布局参数:

TextView tv = new TextView(cx);
tv.setText(textParam);
tv.setTextColor(Color.WHITE);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
tv.setLayoutParams(layoutParams);

this.addView(tv);
于 2013-10-31T20:42:56.857 回答
1

我认为你得到一个NPE因为tv.getLayoutParams();返回null

尝试以下操作:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

tv.setLayoutParams(layoutParams); // the app crashes when I add this line

this.addView(tv);
于 2013-10-31T20:43:16.023 回答