And*_*eaF 21 android android-fragments android-fragmentactivity
我正在构建一个使用Fragment的应用程序和一个MainActivity在同一个ViewPager中显示不同片段的应用程序来复制典型MVC应用程序的行为.
问题是,我不知道如何以编程方式更新片段以更新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;
}
}
Run Code Online (Sandbox Code Playgroud)
用几句话我需要
我怎么能这样做?
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
}
我第一次创建片段时,主要活动通过覆盖成功将参数传递给Fragment getItem(int position),但如果我尝试更改数据,如果我尝试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();
}
}
Run Code Online (Sandbox Code Playgroud)
假设0是第一个Fragment-Tab片段的id(我不确定这种操作),但是fragment.updateDisplay();没有被调用.
luc*_*ler 48
在你的适配器覆盖getItemPosition
@Override
public int getItemPosition(Object object) {
// POSITION_NONE makes it possible to reload the PagerAdapter
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)
之后
viewPager.getAdapter().notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)
应该管用.
我需要了解 Fragment 如何获取 main 传递的数据,也许我遗漏了一些东西,但实际上我还不明白我该如何做到这一点。
由此看来,您似乎想在创建Fragment. 如果这是您想要的,您不应该创建自定义构造函数(通常对于 aFragment您应该只有默认的无参数构造函数(因为平台需要它Fragment在某些时候重新创建))。
相反,您应该将数据传递到Bundle:
@Override
public Fragment getItem(int position) {
switch (position) {
//...
Bundle args = new Bundle();
args.put("a_string_representing_theKey", data)
LineFragment f = new LineFragment();
f.setArguments(args);
return f;
//...
}
}
Run Code Online (Sandbox Code Playgroud)
仅当数据可以放入 a 中时,这才有效Bundle(请参阅类put...的方法Bundle,所有原语 + 对象都是Parcelable)。在片段中,您可以使用 检索参数getArguments()。
您还可以Fragment直接从以下位置检索数据Activity:
// in the lifecycle method where you want the data
((MainActivity)getActivity()).getDataForFragment(); // use the data
Run Code Online (Sandbox Code Playgroud)
例如,我有一个显示图表的片段,(按照我的意图)当我从主调用 setFragment(int Interval, Point[] snodePoint) 时,图表应该在 ViewPager 中更新
你似乎自相矛盾。为此,请使用我链接到的问题中的代码,当然,仅调用当前setFragment()方法不会执行任何操作,因为您只是更新两个变量的值,您需要让 UI 了解更改(例如调用另一个方法)重新创建视图层次结构,在图表视图上设置新值并调用invalidate()等)。
编辑:
我链接到的问题中使用的代码应该可以工作,但您没有使用正确的代码。您有 aFragmentStatePagerAdapter但您正在使用 a 的代码,FragmentPagerAdapter该代码不起作用:
FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) mViewPager.getAdapter();
LineFragment f = (LineFragment) a.instantiateItem(pager, thePositionYouWant);
Run Code Online (Sandbox Code Playgroud)
请记住,上面的代码仅适用于可见片段加上每侧 1 个片段,其他片段将不可用(并且由于用户看不到它们或无法立即移动到它们,所以他们不应该这样做)不更新)。
| 归档时间: |
|
| 查看次数: |
57961 次 |
| 最近记录: |