视图不显示可见性更改

时间:2012-12-03 17:52:34

标签: android android-widget android-animation

我为几个视图的alpha通道设置了一个属性动画集,但我觉得它不应该正常工作。基本上我有3个TextView衍生物,一个TextView和两个Views我想要隐藏它们,在它进入时设置它们的数据然后为它们设置动画。我这样做了几个布局中的其他视图,偶尔也有同样的问题,尽管它很少见。大多数情况下,即使TextView的数据根据​​其Logcat输出有效,Views和其中一个TextView简单也不会出现。它总是相同的两个视图,它们很少显示,但不是我能找到的任何可预测的方式。布局文件的部分和所有动画代码如下。请注意,根据this question,我已将可见性设置为在布局中不可见,并在开始动画之前将其设置为可见。

修改

在有问题的视图上调用`View.bringToFront()没有明显效果。此外,不执行动画,而只是将视图的可见性从不可见更改为可见不会显示它们。从布局中删除可见性更改代码和android:visibility =“invisible”标记也不会使视图显示。

布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:qwerjk="http://schemas.android.com/apk/res/tenkiv.app"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="8dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp" >

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/hourMinuteValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/secondValueTv"
        android:lines="1"
        android:textSize="77sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="miter"
        qwerjk:strokeWidth="1.8" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/secondValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/hourMinuteValueTv"
        android:layout_toLeftOf="@+id/amPmValueTv"
        android:textSize="39sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="1.3" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/amPmValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/hourMinuteValueTv"
        android:layout_alignParentRight="true"
        android:textSize="31sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="1.3" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/dateValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/hourMinuteValueTv"
        android:textSize="19sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="0.9" />

    <View
        android:id="@+id/lineTimeConditionSepView"
        android:layout_width="290dp"
        android:layout_height="3dp"
        android:layout_alignParentRight="true"
        android:layout_below="@id/dateValueTv"
        android:layout_marginTop="4dp"
        android:background="@color/holo_text"
        android:visibility="invisible" />

    <View
        android:id="@+id/lineTimeConditionSepViewOutline2"
        android:layout_width="290dp"
        android:layout_height="1dp"
        android:layout_alignBottom="@id/lineTimeConditionSepView"
        android:layout_alignLeft="@id/lineTimeConditionSepView"
        android:layout_marginTop="0.5dp"
        android:background="@color/location_area_dark_green"
        android:visibility="invisible" />

---THE REST OF THE LAYOUT---

我的片段中的动画方法

public void onUpdateClock(final String time, final String seconds, final String ampm, final String date) {
    Activity activity = getActivity(); //Used to make sure we dont update the clock with the activity dead
    if (activity != null) {
        if (mHourMinuteValue == null) { //These are all used together so this should be safe
            mHourMinuteValue = (MagicTextView) activity.findViewById(R.id.hourMinuteValueTv);
            mSecondValue = (MagicTextView) activity.findViewById(R.id.secondValueTv);
            mAmPmValue = (MagicTextView) activity.findViewById(R.id.amPmValueTv);
            mDateValue = (TextView) activity.findViewById(R.id.dateValueTv);
            mTimeConditionsLine = activity.findViewById(R.id.lineTimeConditionSepView);
            mTimeConditionsOutline2 = activity.findViewById(R.id.lineTimeConditionSepViewOutline2);
            mTimeInAnim = createAnimation(CLOCK_IN);
        }
    }
    if (mHourMinuteValue == null) {
        Log.e(TAG, "Clock text views were null!");
        return;
    }
    uiHandler.post(new Runnable() {
        public void run() {
            mHourMinuteValue.setText(time);
            mSecondValue.setText(seconds);
            if (ampm != null) {
                mAmPmValue.setText(ampm);
            } else {
                mAmPmValue.setText(ClockUICallbacks.EMPTY_AMPM);
            }
            mDateValue.setText(date);
            mDateValue.bringToFront();
            if (mFadeInClock) {
                setClockVisibility(true);
                mTimeInAnim.start();
                mFadeInClock = false;
            }
        }
    });

private void setClockVisibility(boolean visible) {
        int flag;
        if (visible) {
            flag = View.VISIBLE;
        } else {
            flag = View.INVISIBLE;
        }
        mHourMinuteValue.setVisibility(flag);
        mSecondValue.setVisibility(flag);
        mAmPmValue.setVisibility(flag);
        mDateValue.setVisibility(flag);
        mTimeConditionsLine.setVisibility(flag);
        mTimeConditionsOutline2.setVisibility(flag);
    }

private AnimatorSet createAnimation(int type) {
        AnimatorSet set = new AnimatorSet();
        switch (type) {
        case CLOCK_IN:
            ValueAnimator hourMinInAnim = ObjectAnimator.ofFloat(mHourMinuteValue, "alpha", INVISIBLE, OPAQUE);
            hourMinInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator secondInAnim = ObjectAnimator.ofFloat(mSecondValue, "alpha", INVISIBLE, OPAQUE);
            secondInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator amPmInAnim = ObjectAnimator.ofFloat(mAmPmValue, "alpha", INVISIBLE, OPAQUE);
            amPmInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator dateInAnim = ObjectAnimator.ofFloat(mDateValue, "alpha", INVISIBLE, OPAQUE);
            dateInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator timeLine1InAnim = ObjectAnimator.ofFloat(mTimeConditionsLine, "alpha", INVISIBLE, OPAQUE);
            timeLine1InAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator timeLine2InAnim = ObjectAnimator.ofFloat(mTimeConditionsOutline2, "alpha", INVISIBLE, OPAQUE);
            timeLine2InAnim.setDuration(FADE_IN_DURATION);
            set.playTogether(hourMinInAnim, secondInAnim, amPmInAnim, dateInAnim, timeLine1InAnim, timeLine2InAnim);
            return set;
        /*SOME OTHER ANIMATIONS*/
        }
        return null;
    }

可能需要的任何其他信息,请告知我们。

谢谢,Jared

1 个答案:

答案 0 :(得分:0)

事实证明,这是由于在活动中为两个不同的片段创建布局时出错。如果你查看布局,那么MagicTextView的id为dateValueTv。好吧,这个相同的id存在于活动中的另一个布局中,因为两者都使用活动findViewById()方法获取引用,有时他们找到了正确的视图,有时却没有。我发现这是因为我在另一个片段中的文本视图具有此问题文本视图应该具有的数据。我所要做的只是改变他们的身份。我知道我可以基于getView().findViewById()来做到这一点。如果这是最好的做法,我很乐意听到它的评论,但通过检查getActivity()的活动是否为空并从那里获取视图我有一个方便的方法来确保我的后台线程不发布消息如果活动不存在(例如在轮换期间),则为ui处理程序。