0

我有标签,其中有一些Views类似EditText,CheckBoxRadioButton。使用 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;
        }
    }
}

fragment_main_dummy.xml 1 个选项卡 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 的帮助下获得当前页面片段的视图,但我无法获得上一个选项卡的视图。怎么做到呢 ?

提前致谢。

4

1 回答 1

1

给你的几件事,

保存普通视图的状态必须手动完成,唯一能够为您保存状态的视图是 TextView 及其子视图。因此,由于 EditText 是 TextView 它是可能的。

您想尝试的属性:

setFreezesText() 或 android:freezesText 用于 xml。

(注意只有在 TextView 有 ID 时才有效)

这控制此文本视图在冻结到冰柱时是否保存其整个文本内容,以及光标位置等动态状态。默认情况下这是假的,不保存文本。如果文本视图中的文本没有保存在持久存储中的其他位置(例如在内容提供程序中),则设置为 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并且涉及一些检查条件,但它会起作用。当我有时间时,我会寻找一种更优雅的方法来执行此操作并将其发布回此线程。

祝你好运

于 2013-08-15T14:11:47.310 回答