您好我正在尝试在单击网格视图的项目时打开一个片段,但它显示错误java.lang.UnsupportedOperationException:AdapterView中不支持addView(View)。请帮助我。
屏幕碎片:
public class Screen extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.screen, container, false);
int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img};
int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images};
GridView grid = (GridView) view.findViewById(R.id.grid);
Custom_Grid adapter = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
adapter = new Custom_Grid(getContext(), text, imgId);
}
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fragment fragment;
FragmentManager fm = getChildFragmentManager();
switch (position) {
case 0:
fragment = new Temperature();
fm.beginTransaction().replace(R.id.grid,fragment).commit();
break;
case 1:
fragment = new Weight();
fm.beginTransaction().replace(R.id.grid,fragment).commit();
break;
case 2:
fragment = new Length();
fm.beginTransaction().replace(R.id.grid,fragment).commit();
break;
case 3:
fragment = new Time();
fm.beginTransaction().replace(R.id.grid,fragment).commit();
break;
case 4:
fragment = new Area();
fm.beginTransaction().replace(R.id.grid,fragment).commit();
break;
}
}
});
return view;
}
}
CustomGrid:
public class Custom_Grid extends BaseAdapter
{
private Context mContext;
private final int[] text;
private final int[] Imageid;
public Custom_Grid(Context c, int[] text, int[] Imageid) {
mContext = c;
this.Imageid = Imageid;
this.text=text;
}
@Override
public int getCount() {
return text.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
textView.setText(text[position]);
imageView.setImageResource(Imageid[position]);
} else {
grid = (View) convertView;
}
return grid;
}
}
mainactivity:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
Screen scr = new Screen();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.sun,scr);
ft.commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@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;
}
logcat的:
FATAL EXCEPTION: main
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: Process: com.example.cherrypandu.uc, PID: 5117
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: at android.widget.AdapterView.addView(AdapterView.java:469)
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
答案 0 :(得分:0)
您尝试使用setText()
int id资源执行String
,而不是检索String
对象。您也没有正确地View
实例化。
您的适配器应如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = inflater.inflate(R.layout.grid_single, parent, false);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
textView.setText(mContext.getString(text[position]));
imageView.setImageResource(Imageid[position]);
} else {
grid = convertView;
}
return grid;
}
此外,我强烈建议您在adaper中使用ViewHolder
的模式。您可以在此处阅读:ViewHolder
答案 1 :(得分:0)
我只是给你提示,因为你没有在这里发布所有的xml文件。
在MainActivity XML中添加以下框架布局,将在其上切换/添加视图片段:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
将此方法添加到MainActivity.java以切换framgent:
public void switchContentWithBackStack(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container,
fragment).addToBackStack(null).commit();
}
addToBackStack(null)会将当前片段添加到backstack。
在FragmentScreen中获取OnAttach()上的MainActivity实例:
MainActivity mActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = (MainActivity) activity;
}
@Override
public void onAttach(Context activity) {
super.onAttach(activity);
mActivity = (MainActivity) activity;
}
To Switch Fragment通过传递要显示的Fragment对象来调用方法:
mActivity.switchContentWithBackStack(mFragment);
如果此帮助接受,如果您有疑问,请告诉我。
答案 2 :(得分:0)
屏幕片段:
Gridview的onItemClick的变化
public class Screen extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.screen, container, false);
int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img};
int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images};
GridView grid = (GridView) view.findViewById(R.id.grid);
Custom_Grid adapter = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
adapter = new Custom_Grid(getContext(), text, imgId);
}
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fragment fragment;
FragmentManager fm = getActivity().getSupportFragmentManager();
switch (position) {
case 0:
fragment = new Temperature();
fm.beginTransaction().replace(R.id.sun,fragment).commit();
break;
case 1:
fragment = new Weight();
fm.beginTransaction().replace(R.id.sun,fragment).commit();
break;
case 2:
fragment = new Length();
fm.beginTransaction().replace(R.id.sun,fragment).commit();
break;
case 3:
fragment = new Time();
fm.beginTransaction().replace(R.id.sun,fragment).commit();
break;
case 4:
fragment = new Area();
fm.beginTransaction().replace(R.id.sun,fragment).commit();
break;
}
}
});
return view;
}
}