0

ビューから拡張されたカスタムビュークラスがあり、アクティビティで使用したいのですが、何も表示されません。実行中にエラーは発生しませんが、黒い画面には出力がありません。私のコードは次のとおりです。

public class MoveableMenuLayout extends View {


    public MoveableMenuLayout(Context context, AttributeSet attrs) {

        super(context, attrs);
        LinearLayout ll = new LinearLayout(context);
        ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        TextView tv = new TextView(context);
        tv.setText("TES_______________");   
        ll.addView(tv);

        this.invalidate();
        this.requestLayout();
    }

    public MoveableMenuLayout(Context context) {
        super(context);

        LinearLayout ll = new LinearLayout(context);
        ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        TextView tv = new TextView(context);
        tv.setText("TES_______________");   
        ll.addView(tv);

        this.invalidate();
        this.requestLayout();

    }
}

呼び出しアクティビティ

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MoveableMenuLayout layout = new MoveableMenuLayout(this);   
        setContentView(layout);
    }
}

xmlレイアウトに含めて試しましたが、まだ出力されません。何が間違っているのかわかりません。別のクラスにしたいスタイルを変更したくありません。xmlレイアウトを使用して、setcontentviewを使用してActivityに直接設定できることはわかっていますが、そのようにはしたくありません。ありがとう

4

2 に答える 2

1

なぜそうなるのでしょうか-データがありません。線形レイアウトとテキストビューを作成しましたが、それらはあなたの子供ではありません。したがって、描画するデータはありません(とにかく、onDrawをオーバーライドしていません)。

他のビューのセットを保持するカスタムビューを作成する場合は、ViewではなくViewGroupから派生する必要があります。また、最上位のサブビューをデータメンバーとして保持するだけでなく、子として追加する必要があります。LienarLayoutまたはRelativeLayoutから直接派生し、xmlから直接子を膨らませることをお勧めします。

public class MoveableMenuLayout extends ViewGroup {


public MoveableMenuLayout(Context context, AttributeSet attrs) {

    super(context, attrs);
    LinearLayout ll = new LinearLayout(context);
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    TextView tv = new TextView(context);
    tv.setText("TES_______________");   
    ll.addView(tv);
    addView(ll);
}

public MoveableMenuLayout(Context context) {
    super(context);

    LinearLayout ll = new LinearLayout(context);
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    TextView tv = new TextView(context);
    tv.setText("TES_______________");   
    ll.addView(tv);
    addView(ll);

}

}

おそらく動作します。代わりにLinearLayoutから派生することで、これを確実にアップグレードできます。そして、内部レイアウトを用意する必要はありません。このような:

public class MoveableMenuLayout extends LinearLayout {


public MoveableMenuLayout(Context context, AttributeSet attrs) {

    super(context, attrs);
    TextView tv = new TextView(context);
    tv.setText("TES_______________");   
    addView(tv);
}

public MoveableMenuLayout(Context context) {
    super(context);

    TextView tv = new TextView(context);
    tv.setText("TES_______________");   
    addView(tv);

}

}

さらに良い方法は、xmlを介してそれを行うことです

public class MoveableMenuLayout extends LinearLayout {


public MoveableMenuLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate( ourlayoutid,  this );
}

public MoveableMenuLayout(Context context) {
    super(context);

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate( ourlayoutid,  this );

}

}

次に、必要な子をxmlファイルに入れます。この場合、xmlファイルの最上位タグはレイアウトではなくタグである必要があります

于 2013-02-19T17:05:44.673 に答える
0

親の線形レイアウトのレイアウトパラメータを宣言しているだけで、子のテキストビューのレイアウトパラメータを宣言していないため、textviewのレイアウトパラメータの設定も試してください。高さと幅は取得されません。

于 2013-02-19T17:12:56.373 に答える