Android скрывает просмотры

Итак, я немного осмотрелся и вижу, как вы ДОЛЖНЫ это делать, но для меня это просто не работает.

Мне нужно иметь возможность установить альфу RelativeLayout как в XML, так и в коде. Для моего XML у меня есть следующее

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/player_controls"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:alpha="0.0">
    <RelativeLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/player_controls_touch_me"
        >
        </RelativeLayout>
</RelativeLayout>

Я получаю сообщение об ошибке: no resource identifier found for attribute 'alpha' in package 'android'

Кроме того, на основе документации Android я должен иметь возможность вызывать setAlpha(double) для любого объекта View, но когда я пытаюсь сделать этот вызов для RelativeLayout, он сообщает мне, что этот метод не определен для этого объекта.

Почему я не могу контролировать альфа-прозрачность объекта RelativeLayout в Android? Я что-то пропустил? Спасибо!

Обновить

Хотя использование свойства видимости работает, оно не позволяет мне щелкнуть ViewGroup. Это важно для меня, потому что я использую OnTouchListener ViewGroup.

То, что я пытаюсь сделать, это иметь слой с элементами управления мультимедиа, изначально скрытыми. когда пользователь нажимает на любое место на экране, я хочу, чтобы элементы управления исчезали, а когда они снова нажимают на экран, я хочу, чтобы элементы управления исчезали. У меня эта часть уже работает. Я использую группу просмотра, которая находится поверх всего моего приложения с прикрепленным OnTouchListener, который может определить, было ли оно затронуто или нет. Моя проблема в том, что после запуска анимации, чтобы исчезнуть элементы управления, они снова появляются. Если я использую предложение @Hydrangea, я могу заставить его исчезнуть и немедленно сделать невидимым. Это дает мне желаемый эффект, но тогда ViewGroup становится неактивной, и пользователь не может заставить элементы управления вернуться (или уйти, в зависимости от того, что мы решим сделать в первую очередь).

Я надеюсь это имеет смысл.


person Community    schedule 08.03.2011    source источник
comment
Ключевым моментом в ответе Брайана Гриффи является использование setFillAfter(true) в анимации, а не установка вида INVISIBLE или GONE. Это сделает представление прозрачным после завершения анимации.   -  person Yoni Samlan    schedule 17.03.2011


Ответы (7)


Вы захотите использовать альфа-анимацию для постепенного появления и исчезновения элементов. Это сохранит ваши сенсорные события для ваших макетов. Вот пример

public class Main extends Activity {
/** Called when the activity is first created. */

private boolean mShowing = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    findViewById(R.id.textview).setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View arg0) {
            if(mShowing){
            Animation animation = new AlphaAnimation(1.0f, 0.0f);
            animation.setFillAfter(true);
            arg0.startAnimation(animation);
            } else {
                Animation animation = new AlphaAnimation(0.0f, 1.0f);
                animation.setFillAfter(true);
                arg0.startAnimation(animation);
            }

            mShowing = !mShowing;
        }

    });
}

}

Вот сопровождающий xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/textview"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    android:clickable="true"
    />
</LinearLayout>
person Brian Griffey    schedule 15.03.2011
comment
Это было ИМЕННО то, что я искал! Спасибо! - person ; 18.03.2011

Если вам не нужны уровни альфы от 0 до 1, я бы предложил, если вы действительно хотите сделать этот элемент невидимым, использовать setVisibility();

android:visibility="invisible"

Я проверил строку android:alpha, и мой ide ее тоже не нашел. Я не могу понять, почему, хотя... документация кажется довольно ясной.

person Turnsole    schedule 08.03.2011
comment
Я верю, что это может сработать. Я попробую, но мне любопытно, почему в документации определено альфа-свойство, но вы по какой-то причине не можете его использовать. - person ; 08.03.2011
comment
Только что попробовал это, и это работает, но не для моих нужд. Мне нужно иметь возможность установить альфу ViewGroup на 0 (поэтому она скрыта), но затем иметь возможность щелкнуть ту же ViewGroup. Если я использую параметр видимости, он недоступен, когда он скрыт. - person ; 08.03.2011

Свойство alpha появилось в Android 3.0, и это не самый эффективный способ скрыть представление. Используйте View.setVisibility() или android:visibility для достижения желаемого.

person Romain Guy    schedule 17.03.2011

Я думаю, вы можете установить альфу, установив цвет (фона). Значения цвета могут быть в формате #aarrggbb (альфа, красный, зеленый, синий).

person icyerasor    schedule 08.03.2011
comment
Если вы прочитаете мое обновление, это может сработать... но может показаться, что оно немного неуклюже. Однако, если я не смогу найти ничего другого, я попробую это. - person ; 08.03.2011

К правильному ответу можно добавить следующий вариант:

animation.setDuration(xxx);

К каждому экземпляру анимации. Таким образом, ваша анимация будет выглядеть лучше.

person noni    schedule 01.10.2012

Основываясь на вашем описании, вы должны иметь возможность создать представление, содержащее только относительный макет, и установить для него onClickListener. Таким образом, вы можете сделать видимость относительного макета невидимой, но при этом зарегистрировать щелчок.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/clickable_layout"
    android:layout_height="match_parent"
    android:layout_width="match_parent" >
    <RelativeLayout
        android:id="@+id/player_controls"
        android:layout_height="match_parent"
        android:layout_width="match_parent" >
        <RelativeLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:id="@+id/player_controls_touch_me"
        >
        </RelativeLayout>
    </RelativeLayout>
</FrameLayout>
person Cameron    schedule 14.03.2011

Используйте onTouchEvent в Activity, а затем может получить сенсорное событие для управления вашим RelativeLayout, даже если оно «невидимо».

person Jett Hsieh    schedule 16.03.2011