如何从Activity向Fragment发送数据

7
我知道这里有很多关于这个话题的讨论。我也多次阅读了文档,但我找不到从活动传递数据到片段的最佳方法。
我想能够使用带选项卡的滑动视图在两个不同的布局(列表和地图)中显示我的可搜索活动的结果。我必须向片段传递2个数据:“currentLocation”是当前用户位置,“result”是对象列表。
为了使内容更易理解,我省略了代码的某些部分。

SearchableActivity.java

public class SearchableActivity extends ActionBarActivity implements TabListener {

    List<PlaceModel> result = new ArrayList<PlaceModel>();
    private SearchView mSearchView;
    private String currentLocation;

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
        ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_searchable);

    final ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mAppSectionsPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    actionBar.addTab(actionBar.newTab().setText("List").setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText("Map").setTabListener(this));

    // get currentLocation here

    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    handleIntent(intent);
}

private void handleIntent(Intent intent) {

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {

        final String query = intent.getStringExtra(SearchManager.QUERY);

        // get result here
    }
}

@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

}

@Override
public void onTabSelected(Tab tab, FragmentTransaction arg1) {
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

}

}

PlaceListFragment.java

public class PlaceListFragment extends Fragment {
    ListView listViewData;
    PlaceAdapter placeAdapter;
    List<PlaceModel> result = new ArrayList<PlaceModel>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
        Bundle args = getArguments();
        listViewData = (ListView) rootView.findViewById(android.R.id.list);
        // I will pass result and currentLocation here
        placeAdapter = new PlaceAdapter(getActivity(), R.layout.fragment_list_item, result, currentLocation);
        listViewData.setAdapter(placeAdapter);
        return rootView;
    }
}

AppSectionsPagerAdapter.java

public class AppSectionsPagerAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;

public AppSectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int arg0) {
    Bundle data = new Bundle();
    switch(arg0) {
        case 0:
            PlaceListFragment fragment1 = new PlaceListFragment();
            fragment1.setArguments(data);
            return fragment1;
        default:
            PlaceListFragment fragment2 = new PlaceListFragment();
            fragment2.setArguments(data);
            return fragment2;
    }
}

@Override
public int getCount() {
    return PAGE_COUNT;
}
}

我曾经也遇到了同样的问题,我在这里找到了解决方案:https://dev59.com/anrZa4cB1Zd3GeqP2W5f#20673965?noredirect=1#comment30957952_20673965 和 https://dev59.com/Imcs5IYBdhLWcg3wk06X - rupesh
5个回答

7
在Activity的onCreate方法中查找Fragment,并将数据设置到你在Fragment中编写的方法中:
        ExampleFragment rf =  (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.exampleFragment);

    if(rf!=null){
    rf.setExample(currentExample);
    }

"CurrentExample" 是您想要发送到片段中的 "setExample" 方法的任何内容。

public void setExample(ExampleObject currentExample){

    currentExampleInFragment = currentExample;

}

您可以在Fragment的onActivityCreated方法中使用数据。

不确定这是否是一个好的解决方案,但我发现它是传递对象最简单的方法。


7
通常活动会引用它们的片段。在您的 SearchableActivity.java 中,您是否也在 setContentView(activity_searchable.xml); 中加载 PlaceListFragment.java 或者您需要创建该片段的实例并使用 FragmentTransaction 添加/替换片段。

您可以在此找到一个很好的示例,了解如何在片段之间或在活动和片段之间进行通信。

培训链接


activity_searchable.xml 只包含 ViewPager。我为 PlaceListFragment 创建了另一个布局(fragment_list.xml 和 fragment_list_item.xml)。 - tsil
1
从你的代码中,我理解的是你没有将片段填充到mAppSectionsPagerAdapter中。一旦你添加了PageListFragment,你就可以从getItem中获得它的引用。不需要创建一个新的PAgeListFragment实例。查看此示例以了解其工作原理。http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/ - prijupaul
请更新您的最新代码。您是否将片段实例添加到了您的ViewPager适配器中?这也是一个很好的例子,值得一看。http://developer.android.com/reference/android/support/v4/view/ViewPager.html - prijupaul
我现在能够将数据传递给我的片段。但是我注意到只能通过FragmentPagerAdapter实现。就像在getItem方法中这样:Bundle data = new Bundle(); data.putString("my_key", "test"); 但这并不能解决我的问题。我正在寻找一种从Activity传递对象到FragmentPagerAdapter的方法。 - tsil

5
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

在 Fragment 的 onCreateView 方法中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

see detail answer here..


1
创建一个Session模型类,在Activity中设置你想要发送的数据值,然后在Fragment中可以从Session模型类中获取这些值。
例如:你可以这样在Activity中设置。
 AllEventDetails.getInstance().setEvent_description(event_Description);
AllEventDetails.getInstance().setDj_name(dj_name);
AllEventDetails.getInstance().setMusic_theme(music_theme);
AllEventDetails.getInstance().setClub_name(club_name);
AllEventDetails.getInstance().setDate(event_date);
AllEventDetails.getInstance().setBanner_image_path(banner_image_path);
AllEventDetails.getInstance().setEvent_title(event_title);  

你可以从你的Fragment中这样检索:

AllEventDetails.getInstance().getClub_name()
.........

创建会话模型类的方法如下:

Creating Session model class is like this.

public class AllEventDetails {
    private static AllEventDetails mySession ;
    private String event_description;
    private String dj_name;
    private String music_theme;
    private String club_name;
    private String date;
    private String banner_image_path;
    private String event_title;

    private AllEventDetails() {     
        event_description = null;
        dj_name = null;
        music_theme = null;
        club_name = null;
        date = null;
        banner_image_path = null;
        event_title = null;

    }

    public static AllEventDetails getInstance() {
        if( mySession == null ) {
            mySession = new AllEventDetails() ;
        }
        return mySession ;
    }

    public void resetSession() {
        mySession=null;
    }
    public String getEvent_description() {
        return event_description;
    }
    public void setEvent_description(String event_description) {
        this.event_description = event_description;
    }
    public String getDj_name() {
        return dj_name;
    }
    public void setDj_name(String dj_name) {
        this.dj_name = dj_name;
    }
    public String getMusic_theme() {
        return music_theme;
    }
    public void setMusic_theme(String music_theme) {
        this.music_theme = music_theme;
    }
    public String getClub_name() {
        return club_name;
    }
    public void setClub_name(String club_name) {
        this.club_name = club_name;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getBanner_image_path() {
        return banner_image_path;
    }
    public void setBanner_image_path(String banner_image_path) {
        this.banner_image_path = banner_image_path;
    }
    public String getEvent_title() {
        return event_title;
    }
    public void setEvent_title(String event_title) {
        this.event_title = event_title;
    }

}

1
将数据从Activity发送到Fragment
活动:
        Bundle bundle = new Bundle();
        bundle.putString("message", "Alo Stackoverflow!");
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

片段:

读取片段中的值

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

or

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }

你能否请看一下我的问题... http://stackoverflow.com/questions/30303488/how-to-update-fragments-data-used-in-viewpager-view-is-not-showing-the-updated - Arun Badole
@Jorgesys 在您展示的活动中,是否使用“transaction.replace(R.id.fragment_single,fragInfo); transaction.commit();”对片段有好处?我一直在使用“fragment.show(getSupportFragmentManager(),”fragmentname“);” - AJW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接