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.
Grazie molto per questo. – Notbad
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
@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