我有一个包含3个片段的活动A.每个片段互相替换,因此在给定时间只有1个可见。
HomeFragment在2张cardview中包含2个textviews。每个cardview代表一个来自Fragment1和Fragment2的文本值。当我点击说Card1时,我到了Fragment1。
Fragment1有一些cardview,当我选择其中任何一个时,我会导航回HomeFragment并根据我在Fragment1中的选择更新cardview文本。这是switch语句,具体取决于用户选择的卡片我把它放在一个包中将它传递给HomeFragment。
switch (v.getId()) {
case R.id.card_view0:
Fragment1Bundle.putString("Test", "Testing");
bundle.putBundle("Fragment1Bundle", Fragment1Bundle);
fragmentTransaction.setCustomAnimations(R.anim.slideup, R.anim.slidedown, R.anim.slideup, R.anim.slidedown);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragment.setArguments(bundle);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
Fragment2与Fragment 1具有相同的行为。
switch (v.getId()) {
case R.id.card_view0:
Fragment2Bundle.putString("Test2", "Tetsing");
bundle.putBundle("Fragment2Bundle", Fragment2Bundle);
fragmentTransaction.setCustomAnimations(R.anim.slideup, R.anim.slidedown, R.anim.slideup, R.anim.slidedown);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragment.setArguments(bundle);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
我的挑战是我使用bundle在片段之间传递数据,我的home片段使用来自fragment1的数据进行更新但是当我转到片段2并且在选择之后返回到Home片段时,我的fragment1数据是设为默认值。这就是我在Home Fragments onCreateView()
中所做的 try {
bundle1 = getArguments().getBundle("Fragment1Bundle");
bundle2 = getArguments().getBundle("Fragment2Bundle");
tv.setText(bundle1.getString("Test") == null ? null : bundle1.getString("Test"));
tv2.setText(bundle2.getString("Test2") == null ? nul : bundle2.getString("Test2"));
} catch (NullPointerException e) {
Log.d(TAG, e.printStackTrace());
}
我知道我在fragment1和fragment2中的片段事务中创建了一个新的Homefragment,如何只保留一个Home片段实例。
答案 0 :(得分:1)
Google推荐的另一种设计是使用主活动和2个片段(在您的情况下为Fragment1和Fragment2)。我可以看到您将数据包传递给HomeFragment的问题。这个建议的设计使用MainActivity
,它被声明为静态(可能是范围界定问题所必需的)。它使用接口在Activity和Fragment之间建立。我认为界面比将包返回HomeFragment更容易。
Google网页是@ Communicating with Other Fragments。这不仅仅是我的意见。我认为,一个好的SO链接是How to pass data between fragments。
网页上的代码段...
片段到活动通信的一个例子:
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
...
活动到片段通信的一个例子:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
}
}
注意:
OnHeadlineSelectedListener
是Fragment创建的界面。position
,它来自ListFragment中的 ListView (在示例中)。答案 1 :(得分:0)
如何将值从活动传递到已打开的片段并更新数组列表,请帮帮我。当我使用接口时,数组列表大小为零我该怎么办?不要使用捆绑方法。
公共类Main2Activity扩展了AppCompatActivity {
String desc = "data";
OnDataPassedListener onDataPassedListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
String passedArg = getIntent().getExtras().getString("id");
Log.d("data",passedArg);
Scription scription = new Scription();
onDataPassedListener = (OnDataPassedListener)scription;
onDataPassedListener.onDataPassed(passedArg,desc);
}
public interface OnDataPassedListener {
void onDataPassed(String text,String name);
}
}
public class Test extends Fragment implements
Main2Activity.OnDataPassedListener {
。 。 。 。 @Override
public void onDataPassed(String text,String name) {
monthlylists.get(Integer.valueOf(text)).setFood_type(name);
}