我是 android 的新手,我遇到了一个问题。
按照 android 指南中的示例,我开始玩选项卡布局。一切正常,直到我尝试在“公共(public)静态类 PlaceholderFragment”中膨胀 gridview。 下面是 MainActivity.java 中代码的部分副本
public class MainActivity extends AppCompatActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
Toast.makeText(getBaseContext(), "MainActivity onCreate End", Toast.LENGTH_LONG).show();
}
适配器:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PlaceholderFragment.newInstance(position + 1);
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "TAB 1";
case 1:
return "TAB 2";
case 2:
return "TAB 3";
}
return null;
}
以及包含错误的占位符:
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Identificativo del TAB che si sta per visualizzare
int tab_ID = getArguments().getInt(ARG_SECTION_NUMBER);
View rootView;
switch(tab_ID){
case 1: rootView = inflater.inflate(R.layout.fragment_tab1, container, false);
break;
case 2: rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
break;
case 3: rootView = inflater.inflate(R.layout.fragment_tab3, container, false);
GridView gridView = (GridView) rootView.findViewById(R.id.gridview3);
gridView.setAdapter(new MyGridAdapter(MainActivity.this.getApplicationContext()));
break;
default:rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
}
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
行 gridView.setAdapter(new MyGridAdapter(MainActivity.this.getApplicationContext()));
生成“this cannot be referenced from a static context”错误。
MyGridAdapter 代码:
private class MyGridAdapter extends BaseAdapter
{
private List<Item> items = new ArrayList<Item>();
private LayoutInflater inflater;
public MyAdapter(Context context)
{
inflater = LayoutInflater.from(context);
items.add(new Item("Image 1", Color.GREEN));
items.add(new Item("Image 2", Color.RED));
items.add(new Item("Image 3", Color.BLUE));
items.add(new Item("Image 4", Color.GRAY));
items.add(new Item("Image 5", Color.YELLOW));
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int i)
{
return items.get(i);
}
@Override
public long getItemId(int i)
{
return items.get(i).colorId;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup)
{
View v = view;
ImageView picture;
TextView name;
if(v == null)
{
v = inflater.inflate(R.layout.gridview_item, viewGroup, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
}
picture = (ImageView)v.getTag(R.id.picture);
name = (TextView)v.getTag(R.id.text);
Item item = (Item)getItem(i);
picture.setBackgroundColor(item.colorId);
name.setText(item.name);
return v;
}
private class Item
{
final String name;
final int colorId;
Item(String name, int drawableId)
{
this.name = name;
this.colorId = drawableId;
}
}
我尝试仿效其他一些示例,但没有成功。
如果我不将 PlaceholderFragment 类声明为静态,我会在 SectionPagerAdapter 类中遇到 PlaceholderFragment.newInstance(position + 1)
问题。
有人可以帮我解决和理解这个问题吗?
非常感谢!
最佳答案
在 fragment 中,您可以通过调用 getActivity() 方法来获取 Activity 。一旦有了 Activity 对象,就可以通过 getAtivity().getApplicaionContext(); 获取应用程序上下文;
gridView.setAdapter(new MyGridAdapter(getActivity().getApplicationContext()));
关于java - 新手 - 表格布局内的 GridView : this/getApplicationContext cannot be referenced from a static context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34528702/