我正在尝试为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
}
答案 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);
}
}