it-swarm.com.de

Wie kann der Fragmentinhalt aus der Aktivität (Viewpager) aktualisiert werden?

Ich habe einen einfachen ViewPager mit zwei Fragmenten. Jedes Fragment enthält eine TextView. Ich möchte in der Lage sein, den Text der aktuell angezeigten Textansicht aus der Aktivität zu aktualisieren.

Aktivität:

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);
    }
}

Adapter:

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();
    }
}

Fragment :

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

XML-Fragment:

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

Jedes Fragment besitzt eine TextView mit der ID "status" . Das Aktualisieren der Textansicht in onCreateView funktioniert. Aber wie kann ich die Textansicht von überall in der Aktivität aktualisieren?

Ich habe dies ohne Erfolg versucht: 

Fragment : 

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;
    }
}

Aktivität:

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

Es gibt jedoch eine nullPointerException für tv, wahrscheinlich weil das Fragment noch nicht aufgeblasen ist.

Ich habe bereits folgende Fragen ohne Erfolg gelesen: 

18
grunk

In Ihrer MyPagerAdapter-Klasse ruft Android getItem(...) nur dann auf, wenn neue Fragmente erstellt werden sollen. Daher ist es problematisch, dort Verweise zu verwenden, stattdessen sollten Sie die Fragmente einfügen.

Antwort überprüfen support-fragmentpageradapter-hold-verweis auf alte Fragmente

7
faceman

Ich habe dieses Problem so gelöst, den Adapter so erstellen 

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];
    }


}

Dann von Ihrer Tätigkeit 

List<String> rashiCollection = getJSONFromDb(Dates);
adapter.updateData(rashiCollection);
2
yubaraj poudel
@Override
    public int getItemPosition(Object object) {
    XXXFragment fragment = (XXXFragment) object;
        if(…condition){
    fragment.refresh(…);
    }
        return super.getItemPosition(object);
    }

überschreiben Sie die oben genannten. Wenn Sie notifyDataSetChanged () aufrufen, wird die obige Methode ausgelöst. Aktualisieren Sie, wie Sie können.

1
Jaden Gu