2013-02-28 58 views
18

我有一个简单的viewPager与两个片段。每个片段都包含一个TextView。我希望能够更新从活动中显示的当前textView的文本。如何从活动(viewpager)更新片段内容?

活动:

public class MainActivity extends FragmentActivity { 

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

     ArrayList<Fragment> fragments = new ArrayList<Fragment>(); 
     fragments.add(Fragment.instantiate(this, Live.class.getName())); 
     fragments.add(Fragment.instantiate(this, Hit.class.getName())); 

     this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments); 

     ViewPager pager = (ViewPager) findViewById(R.id.viewpager); 
     pager.setAdapter(pagerAdapter); 
    } 
} 

适配器:

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private final ArrayList<Fragment> fragments; 

    public MyPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) 
    { 
     super(fm); 
     this.fragments = fragments; 
    } 

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

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

片段:

public class Live extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.live, container,false); 
    } 
} 

XML片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <TextView android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       android:text="First Fragment" 
       android:id="@+id/status"/> 
</LinearLayout> 

每个片段有id为 “状态” 一个TextView。 更新onCreateView工程中的文本视图。但是,我怎样才能从活动的任何地方更新textView?

我已经试过这一点没有更迭:

片段:

public class Live extends Fragment {  
    public TextView tv; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.live, container,false); 
     tv = (TextView) view.findViewById(R.id.status); 

     return view; 
    } 
} 

活动:

@Override 
    protected void onResume() { 
     super.onResume(); 
     Live frag = (Live) pagerAdapter.getItem(0); 
     frag.tv.setText("Test 2"); 
    } 

但它给我的tv一个NullPointerException,大概是因为片段还没有膨胀。

我已经读了下面的问题没有成功:

回答

7

在你MyPagerAdapter类,Android把唯一的,如果要创建新的片段getItem(...)。因此,在那里使用引用是有问题的,而不是你应该安装碎片。

检查这个答案support-fragmentpageradapter-holds-reference-to-old-fragments

+3

这是100%正确的创建适配器这样

package com.yubraj.sample.adapter; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import com.yubaraj.sample.activities.RashiFragment; import java.util.List; public class PageSliderAdapter extends FragmentStatePagerAdapter { static String[] titleList = new String[] { "today", "this month", "this year" }; List<String> rashi; // private static String TAG = "pagerscreenslider"; public PageSliderAdapter(FragmentManager fm, List<String> rashiList) { super(fm); this.rashi = rashiList; } public void updateData(List<String> rashisList){ rashi.clear(); this.rashi = rashisList; notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return POSITION_NONE; } @Override public Fragment getItem(int position) { Fragment fragment = new RashiFragment(); Bundle bundle = new Bundle(); bundle.putString("RASHI", rashi.get(position)); bundle.putInt("RASHI_TYPE", position); fragment.setArguments(bundle); return fragment; } @Override public int getCount() { return titleList.length; } @Override public String getPageTitle(int position) { return titleList[position]; } } 

然后。我已经和OP一样犯了同样的错误。不要保留你自己的'片段'数组。FragmentPagerAdapter中的FragmentManager包含所有的Fragment,并管理保存和恢复状态。他们也可以被引用 - http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-viewpager/14530629#14530629。 – 2013-02-28 14:31:45

+1

确实使用了:http://tamsler.blogspot.fr/2011/10/android-viewpager-and-fragments.html和http://tamsler.blogspot.fr/2011/11/android-viewpager的第二个解决方案-and-fragments-part-ii.html。但从我所经历的情况来看,无法在创建或恢复活动时访问片段? – grunk 2013-02-28 15:24:50

+0

当时可能并不令人满意。为什么不使用片段自己的生命周期? – faceman 2013-02-28 15:48:18

1
@Override 
    public int getItemPosition(Object object) { 
    XXXFragment fragment = (XXXFragment) object; 
     if(…condition){ 
    fragment.refresh(…); 
    } 
     return super.getItemPosition(object); 
    } 

覆盖上面。当你调用notifyDataSetChanged()时,上面的方法被触发。尽你所能地刷新。

2

我解决了这个问题,这样,从你的活动

List<String> rashiCollection = getJSONFromDb(Dates); 
adapter.updateData(rashiCollection);