如何将数据从 Activity 发送到 Fragment
Posted
技术标签:
【中文标题】如何将数据从 Activity 发送到 Fragment【英文标题】:How to send data from Activity to Fragment 【发布时间】:2013-09-27 18:55:12 【问题描述】:我知道这里有很多关于这个的话题。我也多次阅读文档,但找不到将数据从活动传递到片段的最佳方法。
我希望能够使用swipe Views with tabs 在两种不同的布局(列表和地图)中显示我的可搜索活动的结果。我必须将 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;
【问题讨论】:
我遇到了同样的问题,我从这里找到了我的解决方案***.com/questions/20673956/…***.com/questions/12739909/… 【参考方案1】:在 Activity onCreate 中查找片段并将数据设置为您在片段中编写的方法:
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 方法中使用数据。
不确定这是不是一个好的解决方案,但我发现它是传递对象最简单的解决方案。
【讨论】:
【参考方案2】:通常,活动将引用其片段。在您的SearchableActivity.java
中,您是否还在setContentView(activity_searchable.xml);
中加载PlaceListFragment.java
,或者您需要创建片段实例并使用FragmentTransaction
添加/替换片段。
你可以在这里找到一个很好的例子,说明如何在片段之间或活动和片段之间进行通信。
Training link
【讨论】:
activity_searchable.xml 仅包含 ViewPager。我为 PlaceListFragment 创建了另一个布局(fragment_list.xml 和 fragment_list_item.xml)。 从您的代码中,我了解您没有将片段填充到 mAppSectionsPagerAdapter。添加 PageListFragment 后,您将从 getItem 中获得它的引用。无需创建 PAgeListFragment 的新实例。检查此示例以了解其工作原理。 thepseudocoder.wordpress.com/2011/10/13/… 请更新您的最新代码。您是否将片段实例添加到您的 viewpager 适配器?这也是一个很好的例子。 developer.android.com/reference/android/support/v4/view/… 我现在可以将数据传递给我的片段。但我注意到只有通过 FragmentPagerAdapter 才有可能。像这样在 getItem 方法 Bundle data = new Bundle(); data.putString("my_key", "test");但这并不能解决我的问题。我搜索了一种将对象从 Activity 传递到 FragmentPagerAdapter 的方法。【参考方案3】: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);
在此处查看详细信息answer..
【讨论】:
【参考方案4】:“将数据从 Activity 发送到 Fragment”
活动:
Bundle bundle = new Bundle();
bundle.putString("message", "Alo ***!");
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");
...
...
...
或
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
String myValue = this.getArguments().getString("message");
...
...
...
【讨论】:
你能看看我的问题吗..***.com/questions/30303488/… @Jorgesys 使用“transaction.replace(R.id.fragment_single, fragInfo); transaction.commit();”有什么好处吗?在您在活动中显示的片段上?我一直在使用 "fragment.show(getSupportFragmentManager(), "fragmentname");"【参考方案5】:创建一个 Session 模型类并在 Activity 中设置您想要发送的数据的值,然后在 Fragment 中您可以从 Session 模型类中获取该值
例如。从您的活动中,您可以这样设置。
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);
从你的片段中你可以像这样检索。
AllEventDetails.getInstance().getClub_name()
.........
创建Session模型类是这样的。
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;
【讨论】:
以上是关于如何将数据从 Activity 发送到 Fragment的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从 Android Activity 发送到 Fragment [重复]
将多个 Intent 从单个 Activity 发送到另一个 Activity