我在文件中声明了一张卡:
<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">
并在
cardslib_item_card_view
方法中设置为内容视图: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>
这种过程的规范过程是什么?我做了很多调整,例如:
创建第二个名为
onCreate()
的xml文件,并用cardslib_item_layout.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)
:<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>
在这两个测试中,我都遇到了以下问题:
总的结果是完全不一致的
最重要的是,relativeLayout被放置在卡的顶部,使得对卡的任何操作都不可能(例如,在卡本身设置
cardslib_item_card_view
将不起作用,因为用户将单击relativeLayout而不是卡本身)尝试1:
尝试2:
什么是规范程序?
编辑2:回答
@msk的贡献对我来说很好,尽管我后来发现,经过一些细微的改变,也可以通过使用原始cardslib的
Card.OnCardClickListener
类来获得相同的结果,而不需要创建一个扩展Card
类的新类DeviceCard
。我可以调整我的布局(如屏幕截图所示,头部和卡的其余布局相互重叠),只需对
Card
文件进行一些微小的更改(我以前忽略了这些更改);同时,我可以通过应用mariotti对this问题的回答,消除自动附加到每张卡上的虚拟填充。 最佳答案
试试这个
您可以为卡库定义自己的布局。
创建自定义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);
这种方法对我一直有效
关于android - 使用cardslib定制卡的准确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29987783/