【问题标题】:How to pass arraylist from fragment to fragment using Activity in Android? [duplicate]如何在Android中使用Activity将arraylist从一个片段传递到另一个片段? [复制]
【发布时间】:2017-05-23 09:36:59
【问题描述】:

请给我好的解决方案,我需要你的帮助!

我想使用接口类传递参数

从B Fragment到Activity,从Activity到C Fragment。

但是 Service asynctask 我不知道 C 在等待 B 吗?

请解释一下这个 Fragments 做了什么?

编辑:

public class FeedDetailActivity extends AppCompatActivity implements TabFragment_DetailFeed.ArrayPasser {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

String nameSurname;
int feedId;
public ArrayList<String> pathimg;

Bundle bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_feeddetail);

    // toolbar = (Toolbar) findViewById(R.id.toolbar);
    // setSupportActionBar(toolbar);

    // getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    nameSurname = getIntent().getStringExtra("nameSurname");

    Intent i = getIntent();
    feedId = i.getIntExtra("feedId",0); // 20  for default value
   // feedId = getIntent().getStringExtra("feedId"); // Hata burda

    viewPager = (ViewPager) findViewById(R.id.pager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.setupWithViewPager(viewPager);

    /* TabFragment_DetailComment EditTextinden otomatik klavye açtırmasını kapatmasını sağlıyor.  */
    getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
    );




}
public String getNameSurname() {
    return nameSurname;
}


public int getFeedId() {
    return feedId;
}

private void setupViewPager(ViewPager viewPager) {
    FeedDetailActivity.ViewPagerAdapter adapter = new FeedDetailActivity.ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new TabFragment_DetailFeed(), "DETAIL");
    adapter.addFragment(new TabFragment_DetailComment(), "COMMENT");
    adapter.addFragment(new TabFragment_DetailImage(), "IMAGE");
    adapter.addFragment(new TabFragment_DetailSurvey(), "SURVEY");
    viewPager.setAdapter(adapter);
}


@Override
public void sendArray(ArrayList<String> strings) {
    TabFragment_DetailImage frag = (TabFragment_DetailImage)
            getSupportFragmentManager().findFragmentById();
    frag.method(strings);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

}

【问题讨论】:

    标签: android asynchronous android-activity fragment


    【解决方案1】:

    您应该尝试使用EventBus。有了它,您可以在片段中注册接收器并从代码的任何部分发布事件。

    这是您的片段的一个小例子:

    C 片段 中重写 onResume() 和 onPause() 像这样

    @Override
    public void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        EventBus.getDefault().unregister(this);
    }
    

    并且还订阅你的活动(你需要为它创建类)

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onResult(OnResultEvent event) {
        //do stuff in event
    }
    

    然后在B片段这样做

    public void doStuff(){
       //do stuff here
       EventBus.getDefault().post(new OnResultEvent(result));
    }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您的 Activity 实现了您在 FragmentA 中定义的接口(ArrayPasser)

      public class YourActivity implements FragmentA.ArrayPasser{
          @Override
          public void sendArray(ArrayList<String> strings){
              // Get instance of Fragment B using FragmentManager
              FraB frag = (FragB)
                  getSupportFragmentManager().findFragmentById(R.id.fragment_b);
              frag.someMethod(strings);  //passing arraylist to Fragment B from 
                                               Activity
          }
      }
      
      
      // Fragment A defines an Interface, and calls the method when needed
      public class FragA extends Fragment{
      
          ArrayPasser mCallback; //interface reference
      
          public interface ArrayPasser{
              public void sendArray(ArrayList<String> strings);
          }
      
          @Override
          public void onAttach(Activity activity) {
              super.onAttach(activity);
      
              // This makes sure that the container activity has implemented
              // the callback interface. If not, it throws an exception
              try {
                  mCallback = (ArrayPasser) activity;
              } catch (ClassCastException e) {
                  throw new ClassCastException(activity.toString()
                      + " must implement ArrayPasser");
              }
          }
      
          public void someMethod(ArrayList<String>strings){
              mCallback.sendArray(strings); //passing array list to fragment
          }
      
          @Override
          public void onDetach() {
              mCallback = null; // => avoid leaking
              super.onDetach();
          }
      }
      
      // Fragment B has a public method to do something with the Array 
      public class FragB extends Fragment{
      
          public void method(ArrayList<String> strings){
              // Here you have it
          }
      }
      

      【讨论】:

      • 感谢您的回复,但我不能这样做。流程图应该 Frag A -> Activity -> Frag B 。你能再帮我一次吗?
      • 流程图在我的回答中也是一样的
      • 再次仔细检查流程
      • 我很抱歉我的错误。我编辑我的问题。我知道你的回答是对的,但 frag 即将为空。
      • 感谢编码愉快
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多