3

私はファイルで宣言されたカードを持っています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> 

そのようなプロセスの標準的な手順は何ですか? 私は多くの調整を試みました。

  • と呼ばれる 2 番目の xml ファイルを作成し、この方法で のコンストラクター cardslib_item_layout.xmlを使用して参照します。CardCard 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>

両方のテストで、次の問題が発生します。

  • 全体的な結果は完全に歪んでいます
  • 最も重要なのは、RelativeLayout がカードの上部に配置され、カードに対する操作が不可能になることです (たとえば、Card.OnCardClickListenerユーザーがカード自体ではなく RelativeLayout をクリックするため、カード自体に を設定しても機能しません)。

試行 1: ここに画像の説明を入力 試行 2: ここに画像の説明を入力

正規の手順とは何ですか?

EDIT2:答え

@Msk によって提供された貢献は私にとってはうまくいきましたが、クラスを拡張Cardする新しいクラスの作成に頼ることなく、いくつかのマイナーな変更により、元の cardslib のクラスを使用して同じ結果を得ることも可能であることを後で発見しました。DeviceCardCard

レイアウト (スクリーンショットに示されているように、ヘッダーとカードの残りのレイアウトが互いに重なり合っている) を調整することができましたが、ファイルにわずかな変更を加えるだけで済みましたcardslib_item_layout.xml(以前は見落としていました)。同時に、この質問に対する Mariotti の回答を適用することで、すべてのカードに自動的に付加されるファントム パディングを排除することができました。

4

1 に答える 1

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);

この方法は常に私のために働いています

于 2015-05-01T14:15:52.693 に答える