Android - Getting the context of a fragment in a pager

I have an Android app using a pager as a navigation. For tabs, I have 3 layouts as content. One of the fragments has a gallery, and I want to add images to it. To do this, I need to install the ImageAdapter, but I need to know how to access the fragment context.

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

I use this code above in the onCreate method to get a gallery from a layout that is not content. I have to provide context for the ImageAdapter. But what context should I set there?

EDIT: This is my complete code:

 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); } } } 
+4
source share
4 answers

Fragments do not have their own Context; they use parent activity.

  • To get the parent activity context, use getActivity()
  • To use the application context, use getActivity().getApplicationContext()

Prefer application context where possible.

UPDATE:

getActivity() fragment returns an instance of an Activity if and only if the specified fragment is currently bound to an Activity.


So,

 Fragment f = new MyFragment(); 

creates a fragment, but it is not yet tied to activity. Therefore, f.getActivity() returns null .


After adding it to the action:

 getFragmentManager().beginTransaction().add(f,"fragment").commit(); 

Now getActivity() will return an instance of Activity.


Again, if we separate the fragment from the Activity:

 getFragmentManager().beginTransaction().detach(f).commit() 

getActivity() will return null again.


Therefore, we should not use getActivity() outside the Fragment class, because we cannot be sure of the attached state. Thus, I advise you to use getActivity() inside your own fragment class in your methods: onAttach() , onCreate() or onActivityCreated() .

+14
source

you can use this as

 g.setAdapter(new ImageAdapter(getActivity())); 
+5
source

The easiest and most accurate way to get the fragment context that I found is to get it directly from the ViewGroup when you call the OnCreateView method, at least here you are sure that you will not get null for getActivity ()

 public class Animal extends Fragment { Context thiscontext; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { thiscontext = container.getContext(); 
+3
source

write under the code in your CoreApplication.java step1) the open CoreApplication class extends the application {

Private static instance of CoreApplication ..}

step2) onCreate () {.... instance = this;

}

step3) add this method ()

public static CoreApplication getGlobalApplicationContext () {

 if (instance == null) { throw new IllegalStateException("this application does not 

inherit GlobalApplication ");}

 return instance; 

} Step 4) g.setAdapter (new ImageAdapter (getGlobalApplicationContext ()));

0
source

All Articles