Android ViewPager Отображение TextView в макете - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь настроить ViewPager с несколькими макетами с 2 TextViews в каждом макете.У меня проблемы с тем, чтобы мои TextViews отображались правильно, когда я запускаю свое приложение.Мой пейджер работает нормально, но он не отображает текстовые представления, которые есть в моем макете XML.

Вот мой код, который я имею в своем PageAdapter

public class MyPageAdapter extends PagerAdapter {

public int getCount() {
    return 31;
}

public Object instantiateItem(View collection, int position) {

    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);



    int resId = 0;

    switch (position) {
        case 0:
            resId = R.layout.main_menu;

            break;
        case 1:
            resId = R.layout.article1;

            break;
        case 2:
            resId = R.layout.article2;

            break;
         ....
         ....

    View view = inflater.inflate(resId, null);

    ((ViewPager) collection).addView(view, 0);

    return view;

Это то, что у меня есть для моего XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" android:background="@drawable/background"                     android:clickable="true" 
android:id="@+id/layout13" 
android:weightSum="0">

<TextView
    android:id="@+id/textView01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical|center_horizontal"
    android:padding="12dp"
    android:text="@string/article13"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="#000000" />

<TextView
    android:id="@+id/textView02"
    android:layout_width="match_parent"
    android:layout_height="302dp"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/body13"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="#000000" />



<android.support.v4.view.ViewPager
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:id="@id/viewPager" >

</android.support.v4.view.ViewPager>

</LinearLayout>

Я попытался переместиться в моем макете XML прямо под моей LinearLayout, и я получаю полный экран, но весь мой текст исчезает.Это, наверное, что-то простое, что я упускаю, но любая помощь по этому вопросу будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Вам нужен только один ViewPager. Мое приложение имеет 9 фрагментов и одно действие. Viewpager объявляется один раз в main.xml. Вот как выглядит важный код:

public class Polling extends SherlockFragmentActivity implements OnMenuItemClickListener {
    private ViewPager mViewPager;
    private TabsAdapter mTabsAdapter;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.pager);
        setContentView(mViewPager);

    //here's the code that makes a tab, adds it to the actionbar, adds a tabadapter, and coordinates the viewpager:

bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setDisplayShowTitleEnabled(false);
        bar.setDisplayShowHomeEnabled(false);
        mTabsAdapter = new TabsAdapter(this, mViewPager);
        mTabsAdapter.addTab(bar.newTab().setText(R.string.login),
                LoginFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText(R.string.economics),
                EconFragment.class, null);

Так что это мой основной класс. Вы потеряете, я никогда не использую напрямую весь main.xml: представление контента устанавливается на ViewPager, а не на макет. Затем, внутри моей основной деятельности, у меня есть внутренний класс, который обрабатывает ViewPager влево / вправо, а также управление моими вкладками actionBar. Но не похоже, что вы используете вкладки, поэтому следующий фрагмент кода может быть не очень полезным:

public static class TabsAdapter extends FragmentPagerAdapter
    implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
        private final Context mContext;
        private final ActionBar mActionBar;
        private final ViewPager mViewPager;
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

        static final class TabInfo {
            private final Class<?> clss;
            private final Bundle args;

            TabInfo(Class<?> _class, Bundle _args) {
                clss = _class;
                args = _args;
            }
        }

        public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
            super(activity.getSupportFragmentManager());
            mContext = activity;
            mActionBar = activity.getSupportActionBar();
            mViewPager = pager;
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
        }

        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
            TabInfo info = new TabInfo(clss, args);
            tab.setTag(info);
            tab.setTabListener(this);
            mTabs.add(info);
            mActionBar.addTab(tab);
            notifyDataSetChanged();
        }

        public int getCount() {
            return mTabs.size();
        }

        public SherlockFragment getItem(int position) {
            TabInfo info = mTabs.get(position);
            return (SherlockFragment)Fragment.instantiate(mContext, info.clss.getName(), info.args);
        }

        public void onPageSelected(int position) {
            mActionBar.setSelectedNavigationItem(position);
        }
        public void onPageScrollStateChanged(int state) {}
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            mViewPager.setCurrentItem(tab.getPosition());
            //Log.v(TAG, "clicked");
            Object tag = tab.getTag();
            for (int i=0; i<mTabs.size(); i++) {
                if (mTabs.get(i) == tag) {
                    mViewPager.setCurrentItem(i);
                }
            }
        }
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {}
        public void onTabReselected(Tab tab, FragmentTransaction ft) {}
        public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {}
        public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {}
    }
}
1 голос
/ 02 апреля 2012

Я бы попробовал разместить ваш ViewPager над textViews, вложенным непосредственно под LinearLayout.Мне жаль, что я не могу помочь вам больше - мой опыт работы с ViewPager связан с вкладками TabAdapter / actionBar.

Вот код моего пейджера:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       />

</LinearLayout>

Весь остальной мой интерфейс взят из других вкладок, так что это весь мой main.xml.По сути, я публикую это, чтобы сказать, что мой viewpager является единственным дочерним виджетом внутри линейного макета, и он управляет всем экраном.

...