我建立一個應用程序,使用碎片和一個MainActivity
是表示同ViewPager不同片段複製一個典型的MVC應用程序的行爲。在ViewPager如何更新,刷新片段由主要活動編程
的問題是,不明白我怎麼能編程方式更新片段與新的片斷更新ViewPager
改變
例如,我有這個Fragment
,顯示的圖表,(在我的意圖),當我從主調用setFragment(int interval, Point[] snodePoint)
,圖表應該以ViewPager
public class LineFragment extends Fragment {
static int interval;
static Point snodePoints[];
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.fragment_linegraph, container,
false);
Bundle bundle = this.getArguments();
ChartConfig cg = bundle.getParcelable("FragmentData");
snodePoints = cg.getPoints();
interval= cg.getInterval();
Line l = new Line();
for(int i=0; i<snodePoints.length; i++){
LinePoint p = new LinePoint();
Point sp=snodePoints[i];
p.setX(sp.getX());
p.setY(sp.getY());
l.addPoint(p)
}
l.setColor(getResources().getColor(R.color.green));
LineGraph li = (LineGraph) v.findViewById(R.id.linegraph);
li.addLine(l);
li.setRangeY(0, interval);
li.setLineToFill(0);
li.setOnPointClickedListener(new OnPointClickedListener() {
@Override
public void onClick(int lineIndex, int pointIndex) {
// TODO Auto-generated method stub
}
});
return v;
}
}
更新在幾句話,我需要
- 1-根據主要活動收到的數據創建一個片段。
- 2更改主要活動的片段,每次的數據恰好 像setFragment(...)用新數據(由主總是產生)。
我怎麼能這樣做?
與FragmentAdapter
public class MainActivity extends FragmentActivity {
ViewPager mViewPager;
MyFragmentAdapter mMyFragmentAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.view_pager);
final ActionBar bar = this.getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
LineFragment lineFrag = new LineFragment();
BarFragment barFrag = new BarFragment();
PieFragment pieFrag = new PieFragment();
mMyFragmentAdapter = new MyFragmentAdapter(this, mViewPager);
mMyFragmentAdapter.addTab(bar.newTab().setText("Line"), LineFragment.class,
null, lineFrag);
mMyFragmentAdapter.addTab(bar.newTab().setText("Bar"), BarFragment.class,
null, barFrag);
mMyFragmentAdapter.addTab(bar.newTab().setText("Pie"), PieFragment.class,
null, pieFrag);
mViewPager.setOffscreenPageLimit(mMyFragmentAdapter.getCount() - 1);
}
public static class MyFragmentAdapter extends FragmentStatePagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final MainActivity mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private final ArrayList<Fragment> mFrag = new ArrayList<Fragment>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public MyFragmentAdapter(MainActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args,
Fragment frag) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mFrag.add(frag);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
Bundle args = new Bundle();
ChartConfig cg = new ChartConfig(interval, snodePoint);
args.putParcelable("FragmentData", cg);
Fragment f = mFrag.get(position);
f.setArguments(args);
return f;
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
}
}
}
的第一次,我創建片段的主要活動,主要活動通過overrided getItem(int position)
參數的片段成功,但如果我嘗試要更改數據,同樣如果我嘗試調用適配器mMyFragmentAdapter
上的notifyDataSetChanged()
,則不會發生任何反應,並且ViewPager
中的片段將繼續使用創建中傳遞的相同數據。
EDIT
繼約片段更新其它問題出現了一些部分碼我還試圖此
public void update() {
try{
LineFragment fragment =
(LineFragment) getSupportFragmentManager().findFragmentByTag(
"android:switcher:"+R.id.view_pager+":0");
if(fragment != null)
{
if(fragment.getView() != null)
{
fragment.updateDisplay();
}
}
}
catch(RuntimeException e){
e.printStackTrace();
}
}
假設0是第一個片段-Tab鍵片段I的ID(」我不確定這種操作),但不會調用fragment.updateDisplay();
。
您沒有搜到過很多嗎? http://stackoverflow.com/questions/7379165/update-data-in-listfragment-as-part-of-viewpager – Luksprog
@Luksprog嗯這與我所要求的有點不同。我需要了解Fragment如何通過main傳遞數據,也許我錯過了一些東西,但是我真的不明白我怎麼能這樣做。如果我嘗試爲我的'LineFragment'創建一個自定義構造函數,我得到錯誤'這個片段應該提供一個默認構造函數(一個沒有參數的公共構造函數)' – AndreaF
@AndreaF檢查對話框片段http://developer.android.com/ reference/android/app/DialogFragment.html使用一個靜態的'static MyDialogFragment newInstance(int num)'來傳遞參數,然後使用set和get參數。你傳遞的值就像'newInstance(value)',如果這就是你通過傳遞數據從主到片段 – Raghunandan