Android - mise en contexte d'un fragment dans un pager
J'ai une application android à l'aide d'un téléavertisseur que la navigation. Pour les onglets, j'ai 3 modèles de contenu. Sur l'un des fragments est une galerie et je veux ajouter des images. Pour ce que j'ai à définir une ImageAdapter mais j'ai besoin de savoir comment accéder au contexte d'un fragment.
final LayoutInflater factory = getLayoutInflater();
final View view = factory.inflate(R.layout.pictures, null);
Gallery g = (Gallery) view.findViewById(R.id.gallery1);
g.setAdapter(new ImageAdapter(view.getContext()));
J'utilise le code ci-dessus dans la méthode onCreate pour obtenir de la galerie à partir d'un modèle qui n'est pas le contentview.
Je dois donner un Contexte à la ImageAdapter. Mais quel contexte dois-je le mettre?
EDIT: C'est mon code complet:
package com.bw2801.uwelugemediathek;
import java.util.Locale;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.Context;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.SpinnerAdapter;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
PicturesSectionFragment ps = new PicturesSectionFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Create the adapter that will return a fragment for each of the three
//primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
//Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
//When swiping between different sections, select the corresponding
//tab. We can also use ActionBar.Tab#select() to do this if we have
//a reference to the Tab.
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
//For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
//Create a tab with text corresponding to the page title defined by
//the adapter. Also specify this Activity object, which implements
//the TabListener interface, as the callback (listener) for when
//this tab is selected.
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
final LayoutInflater factory = getLayoutInflater();
final View view = factory.inflate(R.layout.pictures, null);
Gallery g = (Gallery) view.findViewById(R.id.gallery1);
g.setAdapter(new ImageAdapter(ps.getActivity()));
}
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private Integer[] mImageIds = {
R.drawable.image01,
R.drawable.image02,
R.drawable.image03,
R.drawable.image04,
R.drawable.image05,
R.drawable.image06,
R.drawable.image07,
R.drawable.image08,
};
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mImageIds[position]);
i.setLayoutParams(new Gallery.LayoutParams(150, 100));
i.setScaleType(ImageView.ScaleType.FIT_XY);
return i;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
//When the given tab is selected, switch to the corresponding page in
//the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new DummySectionFragment();
case 1:
return new SoundSectionFragment();
case 2:
return ps;
}
return new DummySectionFragment();
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Informationen";
case 1:
return "Soundboard";
case 2:
return "Galerie";
}
return null;
}
}
public static class DummySectionFragment extends Fragment {
public DummySectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.info, container, false);
}
}
public static class PicturesSectionFragment extends Fragment {
public PicturesSectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.pictures, container, false);
}
}
public static class SoundSectionFragment extends Fragment {
public SoundSectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.sounds, container, false);
}
}
}
J'ai la réponse à votre question! Merci beaucoup!
OriginalL'auteur bw2801 | 2013-04-06
Vous devez vous connecter pour publier un commentaire.
Fragments n'ont pas leur propre Contexte, ils utilisent Activité parent.
getActivity()
getActivity().getApplicationContext()
Préfèrent le Contexte de l'Application dans la mesure du possible.
Mise à JOUR:
getActivity()
d'un Fragment renvoie une instance d'Activité si et seulement si, ledit Fragment est actuellement relié à une Activité.Donc,
crée un fragment, mais il n'est pas attaché à une activité encore. Donc
f.getActivity()
retournenull
.Après son ajout à une activité:
Maintenant,
getActivity()
retourne une instance d'Activité.Encore une fois, si nous détacher le fragment de l'Activité:
getActivity()
sera de nouveau de retour d'unnull
valeur.Donc, nous ne devrions pas utiliser
getActivity()
à l'extérieur de laFragment
classe, parce que nous ne pouvons pas être sûr de joints d'état. Donc je vous conseille d'utiliségetActivity()
à l'intérieur du fragment de la propre classe dans ses méthodes:onAttach()
,onCreate()
ouonActivityCreated()
.PicturesSectionFragment ps = new PicturesSectionFragment();
et plus tard dans le code:new ImageAdapter(ps.getActivity().getApplicationContext())
ps.getActivity()
semble être null. Je me suis connecté et que c'étaitnull
.Aucune idée, pourquoi elle est nulle?
Vous appelez
getActivity()
au mauvais endroit et au mauvais moment. Voir mise à jour de réponse.OriginalL'auteur S.D.
vous pouvez utiliser comme cette
getActivity()
n'existe pas...je veux dire, vous voulez créer un nouveau instantanée pour ImageAdaptor il exige Contexte. si on corriger mon code du travail..
essayez comme ceci.g.setAdapter(new ImageAdapter(this));
Dans votre code de votre formulaire de mise en page à onglet activité, il n'est pas correct, vous devez l'ajouter à la galerie de l'un de vos Fragments qu'il fonctionne.
llok à ce exemples android.codeandmagic.org/2011/07/android-tabs-with-fragments neilgoodman.net/2012/03/12/...
OriginalL'auteur RajaReddy PolamReddy
La plus simple et la plus précise pour obtenir le contexte du fragment que j'ai trouvé est de le faire directement à partir de la ViewGroup lorsque vous appelez onCreateView méthode au moins, ici, vous êtes sûr de ne pas obtenir la valeur null pour getActivity()
OriginalL'auteur Amerdroid