用于将片段链接在一起的Android构造

时间:2014-09-24 23:33:21

标签: android android-fragments

我正在为我的应用创建一个小型闪存卡类型元素。我已经查看了几个解决方案,即FragmentStatePagerAdapter及其父FragmentPagerAdapter。这些都没有解决我想要解决的问题。他们处理片段的列表视图。我想要一个片段列表,当我按下一个按钮时,我会移动到列表中的下一个片段,直到我完成所有片段。

我已经解决了所有保存数据部分的问题。我无法弄清楚如何将我的碎片链接在一起。

明确地说,我正在寻找的是:

a-> b-> c-> d->完成并返回活动或完成的片段。 用户显然会使用按钮从片段进展到片段。

我选择了片段因为我认为这是最简单的。我并不反对活动,但我的问题仍然大致相同。

我尝试过实施FragmentPager的东西,但正如我所说,它并不能满足我的需求。

2 个答案:

答案 0 :(得分:2)

您制作的片段有多动态?如果有一定数量的可互换元素,您可以尝试在主活动中创建一个委托函数,该函数根据一组参数打开片段。更好的是,你将片段模块化,以便根据你给出的内容,只有一些片段具有不同的状态。

public void onCardWithIdSelected(int id, String param1, String param2, ...) {
    Fragment fragment = NULL;
    if(id == 0) {
        fragment = cardFragment.newInstanceFromParams(param1, param2, ...);  //this will pass the parameters onto the desired fragment
    }
    else if(id == 1) {
        fragment = cardFragment.newInstanceFromParams(param1, param2, ...);  //this will pass the parameters onto the desired fragment
    }
    else if(id == 2) {
        fragment = cardFragment.newInstanceFromParams(param1, param2, ...);  //this will pass the parameters onto the desired fragment
    }
    //and so on...
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();

    transaction.replace(R.id.content_frame, fragment);
    transaction.addToBackStack(null); //only do this if you don't want users to be able to go back

    // Commit the transaction
    transaction.commit();
}

然后,只要您想从一个片段移动到另一个片段,就可以使用所需参数在主活动上调用此函数。

答案 1 :(得分:0)

我想通过一个相当简单的解决方案来解决这个问题:

我的活动有一些变量,因此它知道它所在的片段,以及它使用framelayout膨胀布局,并使用fragmentmanager事务替换给定的片段编号。然后我有一个parcelable类,它定义了在实例化时传递给每个片段的flashcard。在活动的布局上,我有3个按钮,“检查”,“正确”,“不正确”,使用View.GONE / View.VISIBLE我能够提供我想要的UI体验。点击“正确”/“不正确”后,我们开始交易并将列表向下移动到下一张卡片。

代码:

    /**
     * The activity
     */
    public class VocabTestActivity extends Activity {

        private int mWordsCorrect = 0;
        private int mWordsIncorrect = 0;
        private int mCurrentPosition = 0;
        private ArrayList<Fragment> mCards = new ArrayList<Fragment>();
        private final int FLAG_TOTAL_CARDS = 5;
        private GrammarDataSource mDataSource;

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_practice);

            final Button buttonCheck = (Button) findViewById(R.id.buttonCheckWordPractice);
            final Button buttonCorrect = (Button) findViewById(R.id.buttonCorrectWordPractice);
            final Button buttonIncorrect = (Button) findViewById(R.id.buttonIncorrectWordPractice);
            final TextView textViewProgressBar = (TextView) findViewById(R.id.textViewProgressBarPractice);

            this.mDataSource = new GrammarDataSource(this);

            this.initializeCards();

            buttonCheck.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    buttonCheck.setVisibility(View.GONE);
                    buttonCorrect.setVisibility(View.VISIBLE);
                    buttonIncorrect.setVisibility(View.VISIBLE);
                }
            });

            buttonCorrect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mWordsCorrect++;
                    getFragmentManager().beginTransaction().replace(
                            R.id.practice_frame,
                            mCards.get(mCurrentPosition++)
                    ).commit();
                    buttonCheck.setVisibility(View.VISIBLE);
                    buttonCorrect.setVisibility(View.GONE);
                    buttonIncorrect.setVisibility(View.GONE);
                    textViewProgressBar.setText(getString(R.string.practice_progress_bar, mCurrentPosition, FLAG_TOTAL_CARDS));
                }
            });

            buttonIncorrect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mWordsIncorrect++;
                    getFragmentManager().beginTransaction().replace(
                            R.id.practice_frame,
                            mCards.get(mCurrentPosition++)
                    ).commit();
                    buttonCheck.setVisibility(View.VISIBLE);
                    buttonCorrect.setVisibility(View.GONE);
                    buttonIncorrect.setVisibility(View.GONE);
                    textViewProgressBar.setText(getString(R.string.practice_progress_bar, mCurrentPosition, FLAG_TOTAL_CARDS));
                }
            });
        }

        private void initializeCards() {
            for(VocabWord v : this.mDataSource.selectFlashCards(FLAG_TOTAL_CARDS)) {
                VocabTestFragment frag = VocabTestFragment.newInstance(new ParcelableWord(v));
                mCards.add(frag);
            }
        }
    }


    /**
     * The fragment
     */
    public class VocabTestFragment extends Fragment {

        private ViewGroup mRoot;
        public final String TAG = getClass().getSimpleName();
        private VocabWord mWord;

        public static VocabTestFragment newInstance(ParcelableWord w) {
            VocabTestFragment frag = new VocabTestFragment();
            Bundle args = new Bundle();
            args.putParcelable("word", w);
            frag.setArguments(args);
            return frag;
        }

        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            this.mRoot = (ViewGroup) inflater.inflate(R.layout.fragment_practice_vocab, container, false);

            ItalianWord word = null;

            ParcelableWord pw = getArguments().getParcelable("word");
            pw.printIt();
            word = (ItalianWord) pw.getWord();

            TextView tv = (TextView) this.mRoot.findViewById(R.id.word);
            if(word != null) {
                tv.setText(word.getmId() + " is the id\t" + word.getmWord());
            } else {
                tv.setText("Word not provided");
            }

            return this.mRoot;
        }
    }

/**
 * fragment_practice_vocab
 */
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@android:drawable/gallery_thumb"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/word"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical|center_horizontal"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="placeholder"
        android:layout_weight="4" />

</LinearLayout>

/**
 * practice_activity
 */
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textViewProgressBarPractice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/practice_progress_bar"
        />

    <FrameLayout
        android:id="@+id/practice_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textViewProgressBarPractice"
        >

     </FrameLayout>



<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_gravity="end"
    android:layout_alignParentBottom="true"
    >
    <Button
        android:id="@+id/buttonCheckWordPractice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Check"
        />

    <Button
        android:id="@+id/buttonCorrectWordPractice"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:visibility="gone"
        android:text="Correct"
        />
    <Button
        android:id="@+id/buttonIncorrectWordPractice"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:visibility="gone"
        android:text="Incorrect"
        />

    </LinearLayout>
</RelativeLayout>