So aktualisieren Sie das Fragment in ViewPager programmgesteuert nach Hauptaktivität
Ich baue eine App, die Fragment und eine einzige verwendetMainActivity
Dies zeigt verschiedene Fragmente im selben ViewPager, um das Verhalten einer typischen MVC-Anwendung zu replizieren.
Das Problem ist, dass ich nicht verstanden habe, wie ich das Fragment programmgesteuert aktualisieren kann, um das zu aktualisierenViewPager
mit dem neuen Fragment ändert sich
Zum Beispiel habe ich dasFragment
das zeigt ein Diagramm (in meiner Absicht), wenn ich aufrufesetFragment(int interval, Point[] snodePoint)
Von der Hauptseite aus sollte das Diagramm in aktualisiert werdenViewPager
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;
}
}
In wenigen Worten muss ich
1-Erstellen Sie ein Fragment basierend auf den Daten, die von der Hauptaktivität empfangen wurden.2-Ändern Sie die Daten des Fragments jedes Mal, wenn in der Hauptaktivität etwas passiert wie setFragment (...) mit neuen Daten (immer vom Haupt generiert).Wie könnte ich das machen?
Die Hauptaktivität mit dem 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) {
}
}
}
Wenn ich das Fragment zum ersten Mal erstelle, übergibt die Hauptaktivität erfolgreich die Parameter an das FragmentgetItem(int position)
, aber wenn ich versuche, die Daten zu ändern, versuche ich auch aufzurufennotifyDataSetChanged()
auf dem AdaptermMyFragmentAdapter
passiert nichts und die Fragmente inViewPager
Verwenden Sie weiterhin dieselben Daten, die bei der Erstellung übergeben wurden.
BEARBEITEN
Nach einem Teil des Codes, der in einer anderen Frage zum Fragment-Update gesehen wurde, habe ich dies auch versucht
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();
}
}
Angenommen, 0 ist die ID des ersten Fragment-Tab-Fragments (bei dieser Art von Operation bin ich mir nicht sicher), aberfragment.updateDisplay();
wird nicht aufgerufen.