8

Ich habe viel über Fragmente gelesen. Habe andere Leute gefunden, die Probleme beim Abrufen der Fragmentansicht haben, weil null immer zurückgegeben wurde, aber keine Antwort mein Problem gelöst hat. Ich versuche eine Bildergalerie zu erstellen. Ich habe ein Fragment, das eine Bildansicht enthält. Um die Fragmente anzuzeigen, benutze ich einen android.support.v4.view.ViewPager. Und um die ViewPager zu füttern benutze ich eine android.support.v4.app.FragmentStatePagerAdapter.Fragment getView() liefert immer Null für Fragmente, die von einem FragmentStatePagerAdapter erstellt wurden

Das Problem ist, dass wenn alles erstellt wird und die Bilder angezeigt werden, ich das aktuell angezeigte Bild auf der Festplatte speichern möchte. Also muss ich das aktuelle Fragment Imageview holen, aber ich kann nicht, weil fragment.getView() immer Null ist, die Aktivität, die mit dem Fragment verbunden ist, ist auch null und ich kann nicht herausfinden, warum es ist. Hier einige Code, um zu sehen, ob jemand hier helfen könnte:

Das ist mein Fragment:

public class ImageViewURLFragment extends Fragment 
{ 
    String _url; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) 
    { 
     // The last two arguments ensure LayoutParams are inflated 
     // properly. 
     View rootView = new ImageViewURL(getActivity(), _url); 

     return rootView; 
    } 

    public void setImageURL(String imgURL) 
    { 
     _url=imgURL; 
    } 
} 

Und mein Adapter:

public class ImageViewURLCustomAdapter extends FragmentStatePagerAdapter 
{ 
    List<String> _urls=new ArrayList<String>(); 

    public ImageViewURLCustomAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int i) 
    { 
     ImageViewURLFragment fragment = new ImageViewURLFragment(); 
     fragment.setImageURL(_urls.get(i)); 

     return fragment; 
    } 

    public String getItemUrl(int i) 
    { 
     return _urls.get(i); 
    } 

    @Override 
    public int getCount() { 
     return _urls.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return "OBJECT " + (position + 1); 
    } 

    public void addImageURL(String url) 
    { 
     _urls.add(url); 
    } 
} 

Und das ist die Haupttätigkeit, beachten Sie den Kommentar mit Das bekommen:

Sorry für die langen Quellen, ich habe alles geputzt was ich konnte, wollte ich aber vorbestellen schickte alle spielenden Teile. Könnte irgendjemand raten, was gerade passiert?

Vielen Dank im Voraus.

Antwort

31

Also muss ich das aktuelle Fragment Imageview bekommen, aber ich kann nicht, weil fragment.getView() immer null ist, wird die Aktivität im Zusammenhang mit dem Fragment ist zu null, und ich kann nicht herausfinden, warum es.

, was geschieht, weil Sie _iva.getItem(index); erwar die Fragment zurückzuversetzen die ViewPager für die Seite verwendet, um dem angegebenen Index entspricht. Das wird nicht passieren, da die ViewPager bereits die getItem Methode aufgerufen hat, um die benötigten Fragmente zu erhalten und nach Ihrem Anruf die getItem Methode erhalten Sie eine neue ImageViewURLFragment Instanz. Diese neue Instanz ist nicht an die Activity (getActivity() Rückgaben null) gebunden und ihre Ansicht wurde nicht erstellt.

Wie Sie verwenden ein FragmentStatePagerAdapter den Code unten versuchen, die derzeit sichtbar zu bekommen Fragment:

if (item.getItemId()==R.id.saveToSD) { 
    int index = _vp.getCurrentItem(); 
    Fragment fragment = _vp.getAdapter().instantiateItem(_vp, index); 
    //... 
+0

Vielen Dank dafür. – Notbad

+0

Nachdem ich nach weiteren Informationen gesucht habe, möchte ich fragen, wie Sie diese Informationen über instantiateItem erhalten haben. Ich meine, dass dieser Adapter Fragmente wiederverwenden kann, anstatt jedes Mal ein neues zu erstellen, aber wo haben Sie Informationen gefunden, die wir könnten Rufen Sie instantiateItem direkt auf und dass dies eine vorherige Instanz des Fragments und nicht eine neue zurückgeben würde? Und auf der anderen Seite, wie würden Sie dies tun (aktuelles Element) für ein PageView ?. Danke im Voraus. – Notbad

+1

@Notbad Wenn Sie sich den Quelltext für den 'FragmentStatePagerAdapter' anschauen, werden Sie sehen, dass die' instanziateItem' Methode entweder ein zwischengespeichertes Fragment oder ein neues Fragment zurückgibt. Wenn Sie nach dem aktuellen Fragment suchen, wird es die zwischengespeicherte Version sein. * Und auf der anderen Seite, wie würdest du das machen (aktuelles Item bekommen) für einen PageView? * - Ich verstehe nicht, was du verlangst. Um das aktuelle Fragment von einem FragmentStatePagerAdapter zu erhalten, würden Sie meinen Code aus der Antwort verwenden. – Luksprog

Verwandte Themen