0

、、ViewsなどEditTextのタブがあります。ViewPager を使用して、これらのタブ間をスワイプしています。CheckBoxRadioButton

これが私のコードです:

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 を変更して 2 番目のタブに移動すると、前のタブに書き込んだすべての情報を取得する必要があります。

primaryItem を設定することで現在のページ フラグメントのビューを取得できますが、前のタブのビューを取得できません。どうすればできますか?

前もって感謝します。

4

1 に答える 1

1

あなたのためのいくつかのこと、

通常のビューの状態を保存するには、手動で行う必要があります。状態を保存できる唯一のビューは、TextView とその子です。したがって、EditText は TextView であるため、可能です。

試してみたい物件:

xml の setFreezesText() または android:freezesText。

(メモは、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 を使用して最初のタブのデータを保存し、それを 2 番目のタブに渡すことができます。

 @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;
    }

これで、ダミー フラグメントの新しいインスタンスに、その TextView からのテキストがキー「key」とともに格納され、フラグメントの 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);
}

私が言ったように、それはかなりハックで、いくつかのチェック条件が含まれますが、うまくいきます。時間があれば、これを行うためのよりエレガントな方法を見つけて、このスレッドに投稿します。

幸運を

于 2013-08-15T14:11:47.310 に答える