【问题标题】:View, Viewgroup, onClick, getChildAt problemView、Viewgroup、onClick、getChildAt问题
【发布时间】:2019-03-22 09:09:30
【问题描述】:

我正在尝试使用多张点击翻转的卡片进行活动。

我有一个 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”方法应该启动对象动画器并将它们的目标设置为两个框架布局(卡片的侧面)。

然而,partent framelayout(卡片)是调用“flipcard”方法的视图,它是onclick,但在“flipcard”方法中,我需要将目标设置为子视图。我想过为此使用 .getChildAt() 方法,但我无法使其工作。

翻转卡方法:

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) 它不起作用,因为 xml 中的 onClick 正在寻找一个采用 View 而不是 ViewGroup 的方法。

我需要 onClick 位于父 Framelayout 上,但我需要以某种方式通过它获取子框架布局。

我怎样才能使我最初的想法发挥作用,或者如果我不能,我应该尝试什么其他解决方案?

编辑:解决方案就像放置“ViewGroup viewGroup = (ViewGroup) view;”一样简单在 flipCard 方法的开头。

【问题讨论】:

  • 您可以尝试拨打view.findViewById(R.id.card_front1)而不是getChildAt()
  • @Alexander 问题在于,我有多张卡,而不仅仅是一张。我需要调用被点击的前视图的孩子,而不是总是 card_front1。

标签: java android


【解决方案1】:

使用下面的代码就可以了,我用颜色显示给你 必须把你的颜色

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

}

【讨论】:

  • 这个问题是动画需要在卡片的两边开始。这意味着 onclick 必须在父框架视图上。当卡片旋转时,卡片的两面都有动画。如果我们将其更改为只单击卡片的一侧,那么任何一侧都会设置动画。此外,我的屏幕上有 18 张以上的卡片。有了这个,我必须为每张卡片创建一个 onclick,即使这样也行不通,因为 objectanimation 是这样的。
【解决方案2】:

解决方案很简单,只需将“ViewGroup viewGroup = (ViewGroup) view;”在 flipCard 方法的开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多