使用 Android 动态更改翻转卡片片段上的数据

Changing data dynamically on flip card Fragments using Android

我正在尝试使用 Android 中的翻转动画来练习词汇。我为我的片段制作了一个容器:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:onClick="flipCard"
 />

和两个片段:fragment_card_flip.xmlfragment_card_back.xml。一个是显示单词,另一个是卡片背面的含义。

我从数据库中随机获取一个单词,想更改两个片段中的文本,即将单词放在前面的片段上,将含义放在后面的片段上。在 Fragment 的 onClick() 中,我调用了一个 flipcard() 函数:

public void flipCard(View view) {
    if (mShowingBack) {
        getFragmentManager().popBackStack();
        mShowingBack=false;
    f = (Fragment) getFragmentManager().findFragmentById(R.id.container);
    if(f!=null)
        ((TextView) f.getView().findViewById(R.id.text)).setText(w);
        return;
    }

    // Flip to the back.

    mShowingBack = true;

    getFragmentManager().beginTransaction().setCustomAnimations(
                    R.animator.card_flip_right_in,
                    R.animator.card_flip_right_out,
                    R.animator.card_flip_left_in,
                    R.animator.card_flip_left_out)

            .replace(R.id.container, new CardBackFragment())
            .addToBackStack(null)
            .commit();
}

这只是我试图改变的词,而不是定义。但我无法动态更改片段的文本数据。请帮助我使用数据库中的新 word/meaning 动态更新我的两个片段。

我认为第一步是更改您的片段,以便它们将要显示的单词作为参数:

public class CardFlip extends Fragment {

    public static String ARGUMENT_WORD = "ARGUMENT_WORD"

    public static CardFlip instantiate(String text) {
        CardFlip cardFlip = new CardFlip();
        Bundle argsBundle = new Bundle();
        argsBundle.putString(ARGUMENT_WORD, text);
        cardFlip.setArguments(argsBundle);
        return cardFlip;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String text = getArguments().getString(ARGUMENT_WORD);
        ((TextView) findViewById(R.id.text)).setText(text);
    }
}

对两个片段执行此操作。现在你可以用你想要的词动态地制作片段。

现在您需要做的就是重构您的 flipcard() 方法,以便它使用静态 instantiate 方法而不是 new CardFlip() 构造函数。由于您总是希望您的 Fragments 与最新的单词保持同步,因此不要使用 popBackStack() 使用 FragmentManager.beginTransaction().replace()。像这样:

public void flipCard(View view) {
    Fragment frag;
    if (mShowingBack) {
        frag = CardFlip.instantiate(currentWord);
    }
    else {
        frag = CardBack.instantiate(currentWord);
    }
    getFragmentManager().beginTransaction()
           .replace(R.id.fragment_container, frag)
           .commit();
}

那么你所需要的只是一些关于何时随机更改单词的逻辑。

这些都是官方的概念developer's guide所以你要仔细研究这个:考虑多次阅读那里的指南并做笔记。