簡體   English   中英

ViewPager,滾動標簽+滑動

[英]ViewPager, Scrolling tabs + Swiping

我有一些諸如EditTextCheckBoxRadioButton等之類的Views選項卡。使用ViewPager我在這些選項卡之間滑動。

這是我的代碼:

activity_main.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--
    This title strip will display the currently visible page title, as well as the page
    titles for adjacent pages.
    -->

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

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

MainActivity.java

public class MainActivity extends FragmentActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
     * will keep every loaded fragment in memory. If this becomes too memory
     * intensive, it may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

    private static DBManager dbManager;
    private static SharedPreferences myPrefs;

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

        dbManager = new DBManager();

        try {
            DBManager.init(getApplicationContext());
        } catch (SQLException e) {
            Log.e("SQLException: ", e.toString());
        }

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {

            }

            @Override
            public void onPageSelected(int i) {
                 Log.i("Page", "" + i);
//                Fragment frag = mSectionsPagerAdapter.getPrimaryItem();
//                View v = frag.getView();
//                if(v != null)
//                    Log.i("mda", "haaa");

            }

            @Override
            public void onPageScrollStateChanged(int i) {
                Log.i("mda", "hu");
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {
        private Fragment currentFragment;

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        public Fragment getPrimaryItem(){
            return currentFragment;
        }


        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            Fragment fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 5;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
                case 3:
                    return getString(R.string.title_section4).toUpperCase(l);
                case 4:
                    return getString(R.string.title_section5).toUpperCase(l);
            }
            return null;
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            super.setPrimaryItem(container, position, object);
            currentFragment = (Fragment)object;
        }
    }

    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class DummySectionFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static final String ARG_SECTION_NUMBER = "section_number";

        public DummySectionFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
            TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
            dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));

            return rootView;
        }
    }
}

1個標簽xml的fragment_main_dummy.xml示例

<LinearLayout 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"
              android:paddingLeft="@dimen/activity_horizontal_margin"
              android:paddingRight="@dimen/activity_horizontal_margin"
              android:paddingTop="@dimen/activity_vertical_margin"
              android:paddingBottom="@dimen/activity_vertical_margin"
              tools:context=".MainActivity$DummySectionFragment"
              android:orientation="vertical">

    <TextView
            android:id="@+id/section_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:tag="Mda"/>

    <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/field1"
            android:tag="Muda"
            android:text="lalalala"/>

    <CheckBox
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="New CheckBox"
            android:id="@+id/checkBox"/>

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="76dp"
            android:text="New Text"
            android:id="@+id/textView"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="158dp"/>

    <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New RadioButton"
            android:id="@+id/radioButton"
            android:layout_gravity="left|center_vertical"/>

    <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New RadioButton"
            android:id="@+id/radioButton2"
            android:layout_gravity="left|center_vertical"/>

    <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New RadioButton"
            android:id="@+id/radioButton3"
            android:layout_gravity="left|center_vertical"/>

</LinearLayout>

問題:

我要做的是在更改頁面后從視圖中收集所有輸入。 當用戶更改ViewPage並轉到第二個選項卡時,我需要獲取他在上一個選項卡中編寫的所有信息。

我可以通過設置primaryItem來獲取當前頁面片段的視圖,但無法獲得上一個選項卡的視圖。 如何做呢 ?

提前致謝。

沒什么適合您的,

保存普通視圖的狀態必須手動完成,唯一可以為您保存狀態的視圖是TextView及其子級。 因此,由於EditText是TextView,因此是可能的。

您想嘗試的屬性:

setFreezesText()或android:freezesText用於xml。

(僅當TextView具有ID時,注釋才起作用)

除了動態狀態(例如光標位置)之外,這還控制此文本視圖在凍結為冰柱時是否保存其整個文本內容。 默認情況下為false,不保存文本。 如果未將文本視圖中的文本保存在持久性存儲中的其他位置(例如,在內容提供程序中),則將其設置為true,以便在以后解凍視圖時,用戶不會丟失其數據。

Android文檔參考: http : //developer.android.com/reference/android/widget/TextView.html#setFreezesText%28boolean%29

您可以嘗試做的其他事情是更改視圖分頁器正在緩存的視圖數的限制。 這可以做的是在不重新創建視圖的情況下保留更多視圖,因此不會丟失其中的數據。

您可以使用以下視圖分頁器方法來實現:

setOffScreenPageLimit(int)

Android文檔參考: http : //developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

現在可以通過許多不同的方式來保存所有選項卡中的所有數據,例如,您可以在getItem方法中使用args Bundle來存儲第一個選項卡的數據並將其傳遞給第二個選項卡。

 @Override
    public Fragment getItem(int position) {

        Fragment fragment = new DummySectionFragment();
        Bundle args = new Bundle();
        args.putString("key",myTextView.getText().toString());
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }

現在,您的虛擬片段的新實例將使用鍵“ key”存儲該TextView中的文本,您可以使用片段的getArguments()方法進行檢索。

例如:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

     //here is your arguments
     Bundle bundle=getArguments(); 

    //here is your list array 
    String myString=bundle.getString("key");   
 }

您還可以使用SharedPreferences來存儲數據,然后在想要將其存儲在數據庫中時進行檢索。

這可能有點籠統,但是對共享首選項有一些很好的引用。

http://developer.android.com/guide/topics/data/data-storage.html

讓我知道這個答案是否有幫助,或者您需要更多幫助。

編輯

好的,我想我找到了一種可以實現您要完成的任務的方法,雖然有點黑,但它可以完成工作,直到找到更好的解決方案為止。 如果有時間的話,我可能會再研究一下。

但是現在,這是您可以做的。

方法onPageSelected(int position)是完成大部分工作的地方。

@Override
public void onPageSelected(int position) {
            //This makes sure we get the previous position in the view pager and also
            //makes sure we don't go to -1 when you swipe back to the 0th position.

            //The problem here is if you are using action bar tabs, the user can also select the third tab, from the first tab and the index will be pointing to the second tab. I did not go out of my way to handle this case. But with a few checks you can handle the cases.

            //Also without proper checks, swiping backwards will be an issue, so adding those cases may also be necessary.
    int index = position == 0 ? position : position - 1;


    View view = mViewPager.getChildAt(index);

            // View at this point is the previous view in your view pager
            // and you can access your textviews in the following way.

    TextView myTextView = (TextView) view.findViewById(R.id.section_label);


            // If using action bar tabs, set the selected tab.
    mActionBar.setSelectedNavigationItem(position);
}

就像我說的那樣,它很hacky,涉及一些檢查條件,但是可以正常工作。 我將在有空的時候尋找一種更優雅的方式來執行此操作,並將其發布回該線程。

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM