Горизонтальное смахивание FragmentTabHost

Я реализовал свое навигационное приложение с Navigation Drawer, но один из фрагментов открытого элемента с двумя вкладками.

Вкладки я реализовал "FragmentTabHost", потому что Роман Нурик не рекомендует использовать "ViewPager" с "NavigationDrawer".

Роман Нурик https://plus.google.com/u/0/+DavidTaSmoochhibi/posts/8dWEkFcbTFX

У меня все работает нормально, проблема в том, что FragmentTabHost Можно ли реализовать горизонтальную прокрутку между вкладками?

Прикрепить код:

Main_Activity.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />

MainActivity.java

public class MainActivity extends ActionBarActivity {

private DrawerLayout            mDrawerLayout;
private ListView                mDrawerList;
private ActionBarDrawerToggle   mDrawerToggle;
private Fragment                fragment1;
private Fragment                fragment2;

private String[]                title;
private String[]                subtitle;
private int[]                   icon;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fragment1 = new Fragment1();
    fragment2 = new Fragment2();

    /**
     * Implementacion del NavigationDrawer
     */
    title = new String[] {"Noticias", "Promociones"};
    subtitle = new String[] {"Noticias", "Promociones"};

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

    mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, title));

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    //Enable ActionBar app icon to behave as action to toggle nav drawer
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

        @Override
        public void onDrawerClosed(View drawerView) {
            // TODO Auto-generated method stub
            super.onDrawerClosed(drawerView);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            // TODO Auto-generated method stub
            super.onDrawerOpened(drawerView);
        }
    };

   mDrawerLayout.setDrawerListener(mDrawerToggle);

   if (savedInstanceState ==  null) {
       selectItem(0);
   }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub

    if (item.getItemId() == android.R.id.home) {
        if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
    }

    return super.onOptionsItemSelected(item);
}

/**
 * The click listener for ListView in the navigation drawer
 * @author TeRRo
 */
private class DrawerItemClickListener implements ListView.OnItemClickListener {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // TODO Auto-generated method stub
        selectItem(position);
    }

}

private void selectItem (int position) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    switch (position) {
    case 0:
        ft.replace(R.id.content_frame, fragment1);
        break;

    case 1:
        ft.replace(R.id.content_frame, fragment2);
        break;
    }
    ft.commit();
    //Close drawer
    mDrawerLayout.closeDrawer(mDrawerList);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggles
    mDrawerToggle.onConfigurationChanged(newConfig);
}   
}

Фрагмент1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

Fragment1.java

public class Fragment1 extends Fragment {

//Declare variable of TabHost
private FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    mTabHost = new FragmentTabHost(getActivity());
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.layout.fragment1);
    mTabHost.addTab(mTabHost.newTabSpec("noticas").setIndicator("Noticias"), FragmentTab1.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("promociones").setIndicator("Promociones"), FragmentTab2.class, null);


    return mTabHost;

}

//Detach FragmentTabHost
@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class
                .getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }

}

//Remove FragmentTabHost
@Override
public void onDestroyView() {
    super.onDestroyView();
    mTabHost = null;
}

}

Можно ли реализовать горизонтальное смахивание с помощью FragmentTabHost?

Я искал информацию, но все говорят, что для таких вещей лучше использовать ViewPager.


person joselufo    schedule 22.11.2013    source источник


Ответы (2)


Таким образом, его полный ответ был

Вы не должны использовать навигационные ящики с вкладками панели действий. Если вы стремитесь к пользовательскому интерфейсу, похожему на интерфейс Google Play Music, вам следует реализовать вкладки вручную (и остерегайтесь того, как это выглядит на планшете — вам не нужны полноразмерные панели вкладок на планшетах). Также обязательно ознакомьтесь с сессией «Структура в дизайне приложений для Android» на конференции Google I/O в этом году, где подробно описаны различные шаблоны интерфейса, доступные для раскрытия иерархии приложений.

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

РЕДАКТИРОВАТЬ: если вы действительно хотите сделать TabHost-Swipe вручную, я думаю, единственный способ - использовать детектор Flipper и Gesture (реализующий GestureListener). Это немного кода, который вам нужно реализовать, но я надеюсь, что этот пример Swipe Action и ViewFlipper в Android может вам немного помочь .. ;)

EDIT2: и еще один пример здесь (как будто автор знал, что мы говорили об этом вчера ;))

person Ewoks    schedule 26.11.2013

В одном из моих проектов мне пришлось сделать что-то подобное. Я хотел создать представление, похожее на Google News Stand. Я не мог найти в Интернете ничего, что было бы просто реализовать. Поэтому я написал свой собственный. Я использую FragmentTabHost с ViewPager и прокручиваемыми вкладками. Полная реализация описана в моем блоге здесь.

person hnabbasi    schedule 16.11.2015