我在文件cardslib_item_card_view
中声明了一张卡片:
<it.gmariotti.cardslib.library.view.CardViewNative
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
card_view:cardCornerRadius="4dp"
style="@style/native_recyclerview_card.base"
android:id="@+id/carddemo"
android:layout_width="match_parent" android:layout_height="wrap_content">
并在onCreate()
方法中设置为内容视图:
public class CardMariotti extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cardslib_item_card_view);
//Create a Card
Card card = new Card(this);
CardViewNative cardView = (CardViewNative) this.findViewById(R.id.carddemo);
cardView.setCard(card);
card.setOnClickListener(new Card.OnCardClickListener() {
@Override
public void onClick(Card card, View view) {
Toast.makeText(CardMariotti.this, "Clickable card", Toast.LENGTH_LONG).show();
}
});
}
现在,我想用自己的布局自定义它,包含一个窄标题和一些信息,如下所示:
<RelativeLayout android:id="@+id/cardlayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:background="?android:selectableItemBackground"
android:clickable="true">
<!-- layout containing 3 TextView -->
</RelativeLayout>
这种过程的主流程序是什么?我已经尝试了很多调整,即:
cardslib_item_layout.xml
的xml文件,并使用Card
的构造函数以这种方式引用它:Card card = new Card(this, R.layout.cardslib_item_layout);
然后设置setContentView(R.layout.cardslib_item_card_view)
setContentView(R.layout.cardslib_item_card_view)
。这样; cardslib_item_card_view
:
<it.gmariotti.cardslib.library.view.CardViewNative
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
card_view:cardCornerRadius="4dp"
android:id="@+id/carddemo"
android:layout_width="match_parent" android:layout_height="wrap_content">
<RelativeLayout>
<!-- my layout containing a header and some TextViews -->
</RelativeLayout>
</it.gmariotti.cardslib.library.view.CardViewNative>
在这两个测试中,我遇到了以下问题:
Card.OnCardClickListener
无法正常工作,因为用户将点击RelativeLayout而不是卡本身)尝试1: 尝试2:
什么是canonic程序?
EDIT2:ANSWER
@Msk给出的贡献对我来说很好,虽然我后来发现,通过使用原始的cardlib的
Card
类,通过一些小的改动也可以获得相同的结果,而不采取措施创建一个扩展DeviceCard
类的新类Card
。我能够调整我的布局(标题和卡片的其余布局相互重叠,如屏幕截图所示),只需对
cardslib_item_layout.xml
文件进行一些细微的变化(我以前忽略了);同时,通过应用Mariotti对this问题的回答,我能够消除自动附加到每张卡上的幻像填充。
答案 0 :(得分:2)
试试这个 您可以为cards-lib定义自己的布局。
创建自定义XML:
以下是 custom_layout.xml
的示例<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="6dp"
android:paddingTop="7dp"
android:paddingBottom="7dp"
android:id="@+id/parentView">
<TextView
android:id="@+id/name"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="27"
android:paddingRight="8dp"
android:paddingLeft="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:text=""
android:layout_gravity="center"
android:editable="false"
/>
</LinearLayout>
在您的JAVA代码中,为您要使用的自定义卡创建一个类:
import it.gmariotti.cardslib.library.internal.Card;
import it.gmariotti.cardslib.library.internal.ViewToClickToExpand;
public class DeviceCard extends Card {
private String IP;
private String MAC;
private String name;
private Boolean reachable;
private Boolean editable;
Boolean markedFlag;
public DeviceCard(Context context) {
this(context, R.layout.custom_layout);
}
public DeviceCard(Context context,String param1,...,Type paramn) {
this(context, R.layout.device_card);
this.name = param1;
}
public DeviceCard(Context context, int innerLayout) {
super(context, innerLayout);
init();
Log.d("myTag", "Init called");
}
private void init(){
}
@Override
public void setupInnerViewElements(ViewGroup parent, final View view) {
Log.i("myTag","setupInnerView");
final TextView nameBox = (TextView)view.findViewById(R.id.name);
//edit name if required
}
}
现在在您的JAVA代码中,当您需要使用卡片列表时:
DeviceCard card = new DeviceCard(this, name);
这种方法一直对我有用