如何将数据从 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 [重复]

将数据从Activity发送到Fragment - 如何?

将多个 Intent 从单个 Activity 发送到另一个 Activity

Java Android - 将数据从活动发送到片段

如何将 Twitter Fabric 会话从 Activity 发送到另一个 Activity?

将字符串数据从Activity发送到片段[关闭]