在活动中包含的片段之间传递数据

时间:2015-03-27 19:43:32

标签: android android-fragments

我有一个包含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片段实例。

2 个答案:

答案 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创建的界面。
  • 创建的方法onArticleSelected有一个参数position,它来自ListFragment中的 ListView (在示例中)。
  • 您仍然可以设置数据包并在Activity和Fragment之间发送数据。但是我没有将数据从Fragment发送回Activity。我通常使用Fragment来处理大部分UI更新。

答案 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);
}