8

Ho letto molto sui frammenti. Ho trovato altre persone che hanno problemi a recuperare la vista dei frammenti perché è stato sempre restituito null ma nessuna risposta ha risolto il mio problema. Quello che sto cercando di fare è creare una galleria di immagini. Ho un frammento che contiene una vista dell'immagine. Per mostrare i frammenti uso un android.support.v4.view.ViewPager. E per alimentare il ViewPager io uso un android.support.v4.app.FragmentStatePagerAdapter.Frammento getView() restituisce sempre null per Frammenti creati da FragmentStatePagerAdapter

Il problema è che quando tutto è costruito e le immagini sono mostrate, voglio salvare l'immagine mostrata sul disco. Quindi ho bisogno di ottenere il frameview attuale del frammento ma non posso perché framment.getView() è sempre nullo, anche l'attività associata al frammento è nullo e non riesco a capire perché lo sia. Ecco il codice per vedere se qualcuno potrebbe aiutare qui:

Questo è il mio 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; 
    } 
} 

E questo il mio adattatore:

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

E questa è l'attività principale, notare il commento con the get:

public class MainActivity extends FragmentActivity 
{ 
    ImageViewURLCustomAdapter _iva=null; 
    ViewPager _vp=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     _iva = new ImageViewURLCustomAdapter(
         getSupportFragmentManager()); 
     _iva.addImageURL("http://upload.wikimedia.org/wikipedia/commons/b/b4/Saturn_(planet)_large.jpg"); 
     _iva.addImageURL("http://planetthreesixty.com/sites/default/files/planet.jpg"); 

     _vp = (ViewPager) findViewById(R.id.viewpager); 
     _vp.setAdapter(_iva); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     if(item.getItemId()==R.id.saveToSD) 
     { 
      int index= _vp.getCurrentItem(); 
      Fragment fragment=_iva.getItem(index); 

      //THis is where I need to get fragment view, but always returns null 
        View view= fragment.getView(); 
      ImageView iv=(ImageView)view.findViewWithTag("imageView"); 
      Bitmap bmp=iv.getDrawingCache(); 


     } 


     return super.onOptionsItemSelected(item); 
    } 
} 

Scusate per le lunghe fonti, ho pulito tutto quello che potevo, ma volevo pre inviato tutte le parti di gioco. Qualcuno potrebbe indovinare che cosa sta accadendo?

Grazie in anticipo.

risposta

31

Così ho bisogno di ottenere l'imageview frammento corrente, ma non posso perché fragment.getView() è sempre nullo, l'attività associata con il frammento è nullo troppo e non riesco a capire il motivo per cui è esso.

che sta accadendo, perché vi aspettate _iva.getItem(index); di restituire il Fragment che la ViewPager utilizza per la pagina corrispondente all'indice specificato. Ciò non accadrà dato che lo ha già chiamato il metodo getItem per ottenere i frammenti necessari e dopo aver chiamato il metodo getItem si ottiene una nuova istanza ImageViewURLFragment. Questa nuova istanza non è legata allo Activity (getActivity() restituisce null) e la sua vista non è stata creata.

Come si utilizza un FragmentStatePagerAdapter provare il codice sottostante per ottenere il momento visibile Fragment:

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

Grazie molto per questo. – Notbad

+0

Dopo aver cercato qualche altra informazione, vorrei chiedere come hai ottenuto queste informazioni su instantiateItem. Voglio dire, ho letto che questo adattatore può riutilizzare i frammenti invece di crearne uno nuovo ogni volta, ma dove hai trovato le informazioni che potevamo chiama direttamente instantiateItem e ciò restituirebbe una precedente istanza del frammento e non una nuova? E d'altra parte come faresti questo (ottieni l'elemento attuale) per un PageView ?. Grazie in anticipo. – Notbad

+1

@Notbad Se si guarda il codice sorgente per 'FragmentStatePagerAdapter', si vedrà che il metodo' instantiateItem' restituirà un frammento memorizzato nella cache o un nuovo frammento. Nel caso in cui stai cercando il frammento corrente sarà la versione cache. * E d'altra parte come faresti questo (ottieni l'elemento attuale) per un PageView? * - Non capisco cosa stai chiedendo. Per ottenere il frammento corrente da un FragmentStatePagerAdapter devi usare il mio codice dalla risposta. – Luksprog

Problemi correlati