使用 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.xml
和 fragment_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所以你要仔细研究这个:考虑多次阅读那里的指南并做笔记。
我正在尝试使用 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.xml
和 fragment_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所以你要仔细研究这个:考虑多次阅读那里的指南并做笔记。