1

画像とテキストを追加できるカスタムビューを作成しようとしています。私がこれを行っている理由は、私が作成しているアプリで、これを達成するために同じコードを何度も繰り返しており、それを独自のカスタム ビューにまとめて、セッターと位置を使用できるようにしたいからです。相互に相対的なビューで、このすべてのコードを 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 に答える