我在文件中声明了一张卡:

<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/

10-10 09:54