自定义视图不会显示在Custom ViewGroup中

时间:2014-05-07 10:09:28

标签: android android-custom-view viewgroup

我正在尝试为Android创建一款纸牌游戏,而我却陷入了一个令人困惑的问题。 我有一个名为CardBG的自定义视图,它从ViewFlipper类扩展,因此我可以翻转卡片并显示正面和背面。这很好用。 但我需要在卡上添加一些其他东西,例如Textfield。所以我创建了一个Viewgroup,相信我可以简单地添加Views。将此ViewGroup添加到我的Activity中却没有任何结果。 我究竟做错了什么?这是一个错误的方法吗? 我也试过让Card扩展一个布局类,比如RelativeLayout,但它给了我相同的结果。

以下是相关代码,添加卡片必须动态完成,所以没有xml恶作剧:

TestActivity.java

public class TestActivity extends Activity {
RelativeLayout menuLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_menu);

    menuLayout = (RelativeLayout) findViewById(R.id.layout_menu);

    Card c = new Card(this, null);
    c.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    menuLayout.addView(c);
    }
}

Card.java

public class Card extends ViewGroup{
CardBG background;

TextView text1;

public Card(Context context, AttributeSet attrs) {
    super(context, attrs);
    Log.w("Card", "Constructor");

    background = new CardBG(context, null);
    background.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    this.addView(background);
    }

(protected void onLayout is also in this file, but i do nothing in that method except calling super.onLayout)
}

CardBG.java

public class CardBG extends ViewFlipper{

ImageView blue;
ImageView red;

public CardBG(Context context, AttributeSet attrs) {
    super(context, attrs);
    Log.w("CardBG", "Constructor");

    blue = new ImageView(context);
    blue.setImageResource(R.drawable.card_blue);
    blue.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    this.addView(blue);

    red = new ImageView(context);
    red.setImageResource(R.drawable.card_red);
    red.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    this.addView(red);

    //from here on out there are only onclick listener to test the flipping animations

}

1 个答案:

答案 0 :(得分:1)

同时扩展ViewGroup。您必须实现onLayout方法。在onLayout中,您需要在此ViewGroup的每个子节点上调用layout方法,并为它们提供所需的位置(相对于父节点)。您可以检查FrameLayout的源代码(ViewGroup的最简单子类之一),以了解它是如何工作的。

尽管如此,您可以从 RelativeLayout LinearLayout 或简单的 FrameLayout 扩展您的视图。 RelativeLayout会自行赋予onLayout实现,并为其子代提供相对位置。

修改 您可能需要在当前视图中扩展布局。 示例代码:

 public class Card extends RelativeLayout {

    public Card(Context context, AttributeSet attr) {
          super(context, attr);
          View.inflate(context, R.layout.my_card_layout, this);
     }
    }