2013-04-06 5 views
4

У меня есть приложение для Android, использующее пейджер в качестве навигации. Для вкладок у меня есть 3 макета в качестве контента. На одном из фрагментов есть галерея, и я хочу добавить к ней изображения. Для этого я должен установить ImageAdapter, но мне нужно знать, как получить доступ к контексту фрагмента.Android - Получение контекста фрагмента в пейджере

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

Я использую этот код выше в методе onCreate, чтобы получить галерею из макета, который не является содержимым содержимого. Я должен предоставить контекст для ImageAdapter. Но какой контекст я должен установить там?

EDIT: Это мой полный код:

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

Я действительно получил свой ответ от вашего вопроса! Большое спасибо! – edwoollard

ответ

5

вы можете использовать как этого

g.setAdapter(new ImageAdapter(getActivity())); 
+1

Я не знаю, как вы это понимаете. Метод 'getActivity()' не существует ... – bw2801

+0

Я имею ввиду, что вы хотите создать новый момент для ImageAdaptor, для которого требуется контекст. если он будет исправлен, мой код будет работать. –

+0

getActivity(), кажется, возвращает null. Почему у вас есть идея? – bw2801

14

Фрагменты не имеют свой собственный контекст, они используют родительскую активность.

  • Чтобы получить родительскую активность контекста, используйте getActivity()
  • Для использования контекста приложения, используйте getActivity().getApplicationContext()

Предпочитают Контекст приложения везде, где это возможно.

UPDATE:

getActivity() фрагмента возвращает экземпляр Activity тогда и только тогда, когда, указанный фрагмент в настоящее время присоединен к деятельности.


Так,

Fragment f = new MyFragment(); 

создает фрагмент, но он не привязан к деятельности еще. Следовательно, f.getActivity() возвращает null.


После того, как его добавляют к деятельности:

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

Теперь getActivity() вернет экземпляр Activity.


Опять же, если мы отделите фрагмент из деятельности:

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

getActivity() снова возвращают значение null.


Таким образом, мы не должны использовать getActivity()Fragment вне класса, потому что мы не можем быть уверены прикрепленного статуса. Таким образом, я советую вам использовать getActivity() внутри собственного класса фрагмента в своих методах: onAttach(), onCreate() или onActivityCreated().

+0

Я сделал это так, но это вызывает исключение nullpointer: 'PicturesSectionFragment ps = new PicturesSectionFragment();' и позже в коде: 'new ImageAdapter (ps.getActivity(). GetApplicationContext())' – bw2801

+0

'ps.getActivity() 'кажется нулевым. Я зарегистрировал его, и он был «null». – bw2801

+0

Любая идея, почему она равна нулю? – bw2801

3

Самый простой и точный способ получить контекст фрагмента, который я нашел, чтобы получить его непосредственно из ViewGroup при вызове onCreateView метод, по крайней мере здесь, вы уверены, что не получите нуль для getActivity()

public class Animal extends Fragment { 

Context thiscontext; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 


    thiscontext = container.getContext();