Переключение 2 строк в таблице раскладки в Android
У меня есть таблица раскладок в Android, как это:
1) Row == IMAGEVIEW | TEXTVIEW
2) Row == IMAGEVIEW | SPINNER
Теперь мне нужно переключить TEXTVIEW/SPINNER. Один из ряда 2 идет в ряд 1, а один из 1 - 2.
Было бы здорово иметь немного анимации. Я видел Viewswitcher и Viewflipper, но это не то, что я ищу. У кого-нибудь есть хорошая идея, как заставить это работать?
Мой макет (фрагмент) выглядит так:
<TableRow>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/left_layout_controlls"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:stretchColumns="*"
android:id="@+id/top_controlls"
android:layout_height="wrap_content">
<TableRow>
<ImageView
android:id="@+id/fromCountry_img"
android:src="@drawable/tc_rt_from"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="fill_parent"
/>
<TextView
android:id="@+id/fromCountry"
android:layout_marginTop="2px"
android:layout_marginLeft="2px"
android:background="@drawable/round_edges_main_controll"
android:layout_marginRight="2px"
android:layout_height="38px"
android:layout_width="160dip"/>
</TableRow>
</TableLayout>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:stretchColumns="*"
android:layout_below="@id/top_controlls"
android:layout_height="wrap_content">
<TableRow>
<ImageView
android:src="@drawable/tc_rt_to"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="fill_parent"
android:layout_below="@id/fromCountry_img"
/>
<Spinner
android:id="@+id/toCountry"
android:layout_height="wrap_content"
android:layout_marginTop="2px"
android:layout_marginBottom="2px"
android:layout_marginRight="2px"
android:layout_width="160dip"
android:layout_weight="1"
android:drawSelectorOnTop="true"/>
</TableRow>
</TableLayout>
Обновить:
Я попытался переключить контроллеры, как это, и анимация работает, но когда анимация закончится, контроллеры вернутся в свое прежнее положение.
Есть идеи почему?
LinearLayout layout1 = ((LinearLayout) DataHolder.activityHolder.findViewById(R.id.top_controll));
LinearLayout layout2 = ((LinearLayout) DataHolder.activityHolder.findViewById(R.id.bottom_controll));
DataHolder.activityHolder.findViewById(R.id.toCountry));
TranslateAnimation a = new TranslateAnimation(
Animation.ABSOLUTE,0,Animation.ABSOLUTE,0,
Animation.ABSOLUTE,0,Animation.ABSOLUTE, 40);
a.setDuration(1200);
TranslateAnimation b = new TranslateAnimation(
Animation.ABSOLUTE,0,Animation.ABSOLUTE,0,
Animation.ABSOLUTE,0,Animation.ABSOLUTE, -40);
b.setDuration(1200);
layout1.startAnimation(a);
layout2.startAnimation(b);
3 ответа
Самый простой способ сделать это - иметь Spinner с видимостью GONE(которого нет в контейнере), где у вас есть TextView и TextView, где у вас есть Spinner. Тогда просто поменяйте видимость. Это решение не практично.
grmpf,
получил это на работу. Благодарю. ошибка заключалась в том, что я запустил это:
setFillAfter(true);
это сохранит изменение после окончания анимации
Честно говоря, я думаю, что использование TableLayout для этой ситуации нецелесообразно. Хотя представленное вами представление подразумевает, что TableLayout является наиболее практичным, TableLayout спроектированы так, чтобы быть довольно статичными. Я не знаю, что есть метод для удаления или анимации TableRows в TableLayout.
Я бы предложил использовать это следующее:
<LinearLayout android:orientation="vertical" ... >
<LinearLayout android:orientation="horizontal" ... >
CONTENTLAYOUTS
</LinearLayout>
... MORE LINEARLAYOUTS FOR MORE ROWS
</>
Затем вы можете манипулировать позициями этих предметов.
Например, вы можете сохранить текущие позиции как таковые:
LinearLayout layout1 = (LinearLayout) findViewById(R.id.layout1);
int position1 = layout1.getTop();
LinearLayout layout2 = (LinearLayout) findViewById(r.id.layout2);
int position2 = layout2.getTop();
AnimationSet animSet = new AnimationSet(...);
//define your animations here, or load them from resources
//to move each view to each of the two positions, changing the
//Y coordinate of the Views
Убедитесь, что вы используете AnimationSet, чтобы обе анимации выполнялись одновременно.
Надеюсь, это поможет! Дайте мне знать, если что-то из этого сбивает с толку, и я постараюсь прояснить это.