0

RelativeLayout を使用して、Activity の ScrollView 内に追加されるカスタム ViewGroup を作成しようとしています。ViewGroup を作成するために、次のクラスを作成しました。

public class MessageView extends RelativeLayout implements MessageType {

    View mView;
    public TextView messageText;

    public MessageView(Context context, int type) {
        super(context);

        MAX_LINE = getResources().getInteger(R.integer.MAX_LINE);
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (type == MESSAGEFROM) {
            inflater.inflate(R.layout.message_layout_from, this, true);
        } else {
            inflater.inflate(R.layout.message_layout_to, this, true);
        }
    }

    @Override
    public void onFinishInflate() {
        Log.d("MessageView", "Finished Inflation");
        super.onFinishInflate();
        addView(mView, 0);
        messageText = (TextView) findViewById(R.id.messageText);
    }

    public void setText(String s) {
        this.messageText.setText(s);
    }

メインアクティビティでは、次のように新しい MessageView を作成しています。

MessageView a = new MessageView(getApplicationContext(), MESSAGEFROM);
a.setText(message);
chatRoom.addView(a);

しかし、onFinishInflate()メソッドが呼び出されず、でnullPointerExceptionエラーが発生していa.setText(message)ます。次の行がコンストラクターで使用されている場合、同じエラーが発生しますMessageView()

messageText = (TextView) findViewById(R.id.messageText);
4

1 に答える 1

0

問題は、RelativeLayout がテキストビューを見つける方法を知らないことだと思います。あなたのテキスト ビューは、膨張した xml ファイルからのものであると想定しています。したがって、膨張したビューへの参照を保存してから、findViewByIdを使用すると言います

コードでは、

View inflated = inflater.inflate(R.layout.message_layout_from, this, true);
messageText = (TextView) inflated.findViewById(R.id.messageText);

その ID は通常、レイアウト XML ファイルで割り当てられますが、別のアプローチ (RelativeLayout の拡張) を使用しました。

于 2014-12-21T06:40:55.897 に答える