Проблема просмотра, Viewgroup, onClick, getChildAt

#java #android

#java #Android

Вопрос:

Я пытаюсь выполнить действие с несколькими карточками, которые переворачиваются по щелчку.

У меня есть Framelayout (карта) с двумя другими Framelayout (две стороны карты) в нем, вот так:

 <FrameLayout
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_margin="5dp"
    android:layout_columnWeight="1"
    android:layout_rowWeight="1"
    android:onClick="flipCard">

    <FrameLayout
        android:id="@ id/card_back1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include layout="@layout/card_back" />

    </FrameLayout>

    <FrameLayout
        android:id="@ id/card_front1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

         <include layout="@layout/card_front" />

    </FrameLayout>
</FrameLayout>
  

У меня есть метод «flipCard», который ДОЛЖЕН запускать objectanimators и устанавливает их цели для двух framelayouts (сторон карты).

Однако часть framelayout (карта) — это представление, которое вызывает метод «flipcard» с помощью onclick , но в методе «flipcard» мне нужно установить цели для дочерних представлений. Я думал использовать для этого метод .getChildAt (), но я не могу заставить его работать.

метод flipCard:

 public void flipCard(View view) {
    if (!mIsBackVisible) {
        mSetRightOut.setTarget(view.getChildAt(1));
        mSetLeftIn.setTarget(view.getChildAt(0));
        mSetRightOut.start();
        mSetLeftIn.start();
        mIsBackVisible = true;
    } else {
        mSetRightOut.setTarget(view.getChildAt(0));
        mSetLeftIn.setTarget(view.getChildAt(1));
        mSetRightOut.start();
        mSetLeftIn.start();
        mIsBackVisible = false;
    }
}
  

Если я изменю метод flipCard на «flipCard (ViewGroup Viewgroup), это не сработает, потому что onClick в xml ищет метод, который принимает View, а не ViewGroup.

Мне нужно, чтобы onClick был в родительском Framelayout, но мне нужно каким-то образом получить дочерние framelayouts через него.

Как я могу заставить мою первоначальную идею работать, или, если я не могу, какое другое решение мне следует попробовать?

РЕДАКТИРОВАТЬ: решение было таким же простым, как размещение «ViewGroup ViewGroup = (ViewGroup) view;» в начале метода flipCard.

Комментарии:

1. вы можете попробовать вызвать view.findViewById(R.id.card_front1) вместо getChildAt()

2. @Alexander Проблема в том, что у меня несколько карт, а не только одна. Мне нужно вызвать дочерние элементы frontview, на которые нажимается, а не всегда card_front1.

Ответ №1:

Используйте приведенный ниже код, это сработает, я использую color, чтобы показать, что там вы должны указать свой цвет

layout.xml

  <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <FrameLayout
        android:id="@ id/llOne"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@color/colorGrey"
        android:duplicateParentState="true"
        android:orientation="vertical"
        android:visibility="gone" />

    <FrameLayout
        android:id="@ id/llTwo"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@color/colorAccent"
        android:duplicateParentState="true"
        android:orientation="horizontal" />
</FrameLayout>
  

Demo.Java

  public class demo extends AppCompatActivity {

private FrameLayout llOne, llTwo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_demo);
    initBasic();
}

private void initBasic() {
    llOne = findViewById(R.id.llOne);
    llTwo = findViewById(R.id.llTwo);
    llOne.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            llOne.setVisibility(View.GONE);
            llTwo.setVisibility(View.VISIBLE);
        }
    });
    llTwo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            llOne.setVisibility(View.VISIBLE);
            llTwo.setVisibility(View.GONE);
        }
    });
}
  

}

Комментарии:

1. Проблема в том, что анимацию нужно запускать для обеих сторон карты. Это означает, что onclick должен находиться на родительском frameview. Когда карта вращается, появляется анимация для обеих сторон карты. Если мы изменим это так, чтобы мы нажимали только на одну сторону карточки, тогда только одна сторона будет анимирована. Также у меня на экране более 18 карточек. При этом мне пришлось бы создать onclick для каждой карты, и даже это не сработало бы из-за того, как работает objectanimation.

Ответ №2:

Решение было таким же простым, как установка «ViewGroup ViewGroup = (ViewGroup) view;» в начале метода flipCard.