android mainactivity 刷新fragment,android – 如何以编程方式通过Main Activity更新刷新ViewPager中的Fragment...

本文介绍了一个Android应用的问题,该应用使用ViewPager展示多个Fragment。开发者试图从MainActivity以编程方式更新Fragment,尤其是在数据变化时。在FragmentAdapter中,数据在创建Fragment时传递,但尝试通过调用`notifyDataSetChanged()`更新数据未成功。此外,尝试通过查找并调用`updateDisplay()`方法直接更新Fragment也未生效。解决方案可能涉及正确地通知Adapter数据变化并更新Fragment实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在构建一个使用Fragment和单个MainActivity的应用程序,它在同一个ViewPager中显示不同的片段,以复制典型MVC应用程序的行为.

问题是我还没有理解如何以编程方式更新片段以使用新的片段更改来更新ViewPager

例如,当我从main调用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

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(…)这样的新数据(总是由main生成).

我怎么能这样做?

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 mTabs = new ArrayList();

private final ArrayList mFrag = new ArrayList();

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) {

}

}

}

我第一次创建片段时,主要活动通过覆盖的getItem(int位置)将参数传递给Fragment,但是如果我尝试更改数据,我也尝试在适配器上调用notifyDataSetChanged()mMyFragmentAdapter没有任何反应,ViewPager中的片段继续使用创建时传递的相同数据.

编辑

在关于片段更新的其他问题中看到一些部分代码后,我也尝试了这个

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是第一个Fragment-Tab片段的id(我不确定这种操作),但是fragment.updateDisplay();没有被调用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值