Как сделать трехпанельный дисплей с двумя активными одновременно (по Gmail) - PullRequest
0 голосов
/ 26 апреля 2011

Я пишу приложение, которое будет выглядеть как gmail.На самом деле я хочу, чтобы на экране были активны 2 панели, как в приложении Honeycomb Gmail.

Мой основной макет:

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

    <fragment android:name="org.bicou.newsreader.SubscriptionsList"
        android:id="@+id/fragment_left_list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

    <FrameLayout android:id="@+id/fragment_middle_content" android:layout_weight="3"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />

    <FrameLayout android:id="@+id/fragment_right_content" android:layout_weight="8"
        android:visibility="gone"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />

</LinearLayout>

Фрагмент SubscriptionsList при загрузке,заполняет fragment_middle_content framelayout другим фрагментом.

Когда я что-то делаю во втором фрагменте, я хочу:

  • hide fragment_left_list
  • put fragment_middle_content влево
  • показать fragment_right_content с 3-м фрагментом.

Однако я не знаю, как это сделать.Как и в приведенном выше макете XML, вы можете видеть, что макет 3-го кадра скрыт (видимость == исчезла).Поэтому, когда я что-то делаю во втором фрагменте, у меня есть:

        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        // Hide the left pane
        SubscriptionsList sl = (SubscriptionsList) fm.findFragmentById(R.id.fragment_left_list);
        ft.hide(sl);

        // Show the right pane
        OneItem oi = OneItem.newInstance(mEntries.get(position));
        ft.replace(R.id.fragment_right_content, oi);
        ft.show(oi);
        getActivity().findViewById(R.id.fragment_right_content).setVisibility(View.VISIBLE);

        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();

Это работает один раз.Когда я возвращаюсь назад, стек назад восстанавливает транзакции фрагментов, но не скрывает третий фрагмент.

Я знаю, что у меня нет правильного подхода, но я еще не знаком с API программирования 3.0.

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Я нашел кое-что, что работает:

  • Я сделал третий фрагмент на самом деле <fragment> в XML.
  • , когда приложение запускается, я добавляю транзакцию, которая его скрывает
  • когда я щелкаю элемент, я показываю его и заменяю его содержимым, которое я хочу отобразить

Результат довольно медленный, но я думаю, что это потому, что он инициализирует веб-просмотрв содержании при отображении перехода.Я найду способ сделать это гладко.

0 голосов
/ 15 февраля 2012

Я сделал это с переопределением кнопки возврата в основной деятельности.Я использую 1 фрагмент, следующий за 2 FrameLayouts в XML-файле основного макета.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        View partlarFrame = findViewById(R.id.partview_fragment);
        if(partlarFrame != null && partlarFrame.getVisibility() == View.VISIBLE)
        {
            partlarFrame.setVisibility(View.GONE);
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
            ft.show(getSupportFragmentManager().findFragmentById(R.id.tutlist_fragment));
            ft.remove(getSupportFragmentManager().findFragmentById(R.id.partview_fragment));
        ft.commit();
        return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
...