3

これは非常に簡単なはずですが、15分ほど検索しても、まだ答えが得られません。

TextViewとボタンを組み合わせたカスタムAndroidビューに加えて、いくつかのカスタマイズされた動作/メソッドを作成したいと思います。たとえば、ボタンをクリックすると、TextViewが「Hello、world!」に変更されます。

Viewクラスを拡張し、XMLでレイアウトを設計してから、2つをリンクするために魔法をかける必要があることを私は知っています。魔法とは何か教えていただけますか?アクティビティでこれを行う方法は知っていますが、カスタムビューではできません。

編集済みわかりました。レイアウトで定義された子ビューでクラスを膨らませるには、インフレータ を使用する必要があることがわかりました。これが私が得たものです:

public class MyView extends View  {

private TextView text;
private Button button;

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    View.inflate(context, R.layout.myview, null);
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    text = (TextView) findViewById(R.id.text);
    button = (Button) findViewById(R.id.button);
}
}

ただし、textおよび子buttonビューはnullでした。何か案が?(XMLは非常に単純で、特別な編集は必要ありません。EclipseツールバーからTextViewとButtonを取得して、スローインするだけです。)

4

1 に答える 1

7

さて、私自身の質問に対する答えは次のとおりです。(i)夕食を取りに行く、(ii)LinearLayout代わりに拡張するView、これにより、メソッドViewGroupに渡すことができますが、メソッドinflate(...)をオーバーライドする必要はありませんonLayout(...)。更新されるコードは次のようになります。

public class MyView extends LinearLayout  {
    private TextView text;
    private Button button;

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.myview, this);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        text = (TextView) findViewById(R.id.text);
        button = (Button) findViewById(R.id.button);
    }
}
于 2012-05-28T10:24:14.490 に答える