片段中的Android listview
我在片段内部实现listview时遇到一些问题,我使用[ActionBarSherlock侧菜单导航抽屉][1] [1] :来自本教程 侧面导航链接无法正常工作,当我点击第二个菜单时,它将平稳显示片段2,但当我点击第一个菜单再次显示片段1时,应用程序崩溃 这是我的密码 MainActivity.java片段中的Android listview,android,listview,Android,Listview,我在片段内部实现listview时遇到一些问题,我使用[ActionBarSherlock侧菜单导航抽屉][1] [1] :来自本教程 侧面导航链接无法正常工作,当我点击第二个菜单时,它将平稳显示片段2,但当我点击第一个菜单再次显示片段1时,应用程序崩溃 这是我的密码 MainActivity.java package com.androidbegin.sidemenututorial; import com.actionbarsherlock.app.SherlockFragmentActi
package com.androidbegin.sidemenututorial;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.support.v4.view.GravityCompat;
public class MainActivity extends SherlockFragmentActivity {
// Declare Variable
DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
MenuListAdapter mMenuAdapter;
String[] title;
String[] subtitle;
int[] icon;
Fragment fragment1 = new Fragment1();
Fragment fragment2 = new Fragment2();
Fragment fragment3 = new Fragment3();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_main);
// Generate title
title = new String[] { "Promos", "Womens Wear",
"Mens Wear" };
// Generate subtitle
subtitle = new String[] { "Subtitle Fragment 1", "Subtitle Fragment 2",
"Subtitle Fragment 3" };
// Generate icon
icon = new int[] { R.drawable.menu_promo, R.drawable.menu_women,
R.drawable.menu_men };
// Locate DrawerLayout in drawer_main.xml
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// Locate ListView in drawer_main.xml
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set a custom shadow that overlays the main content when the drawer
// opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
// Pass results to MenuListAdapter Class
mMenuAdapter = new MenuListAdapter(this, title, subtitle, icon);
// Set the MenuListAdapter to the ListView
mDrawerList.setAdapter(mMenuAdapter);
// Capture button clicks on side menu
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// Enable ActionBar app icon to behave as action to toggle nav drawer
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
// TODO Auto-generated method stub
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
// TODO Auto-generated method stub
super.onDrawerOpened(drawerView);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(0);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
}
return super.onOptionsItemSelected(item);
}
// The click listener for ListView in the navigation drawer
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
selectItem(position);
}
}
private void selectItem(int position) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Locate Position
switch (position) {
case 0:
ft.replace(R.id.content_frame, fragment1);
break;
case 1:
ft.replace(R.id.content_frame, fragment2);
break;
case 2:
ft.replace(R.id.content_frame, fragment3);
break;
}
ft.commit();
mDrawerList.setItemChecked(position, true);
// Close drawer
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
下面是我的列表设计和适配器代码
WomenList.java
package com.androidbegin.sidemenututorial;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleAdapter;
public class WomenList extends ListFragment {
// Array of strings storing country names
String[] brandname = new String[] {
"Limited Collection",
"Brand Collection",
"LifeStyle Collection",
"Famous Collection",
"Lingerie"
};
// Array of integers points to images stored in /res/drawable/
int[] imgbrands = new int[]{
R.drawable.fashion,
R.drawable.lingerie,
R.drawable.fashion,
R.drawable.samplemodel,
R.drawable.lingerie
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
// Each row in the list stores country name, currency and imgbrand
List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>();
for(int i=0;i<5;i++){
HashMap<String, String> hm = new HashMap<String,String>();
hm.put("txt", "Brand: " + brandname[i]);
hm.put("imgbrand", Integer.toString(imgbrands[i]) );
aList.add(hm);
}
// Keys used in Hashmap
String[] from = { "txt","imgbrand" };
// Ids of views in listview_layout
int[] to = {R.id.txt,R.id.imgbrand};
// Instantiating an adapter to store each items
// R.layout.listview_layout defines the layout of each item
SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList,
R.layout.listview_layout, from, to);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
}
注意:当版面包含一个片段时,不能将版面膨胀为片段。嵌套片段仅在动态添加到片段时才受支持
尝试以下方法修复它:
public void onDestroyView() {
super.onDestroyView();
Fragment fragment = (getFragmentManager().findFragmentById(R.id.your_fragment));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
// ft.commitAllowingStateLoss(); //If u want to handle orientation as well
}
然后,您可以按如下方式创建视图:
private static View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.main, container, false);
} catch (InflateException e) {
e.printStackTrace();
}
return view;
}
我还建议您在主要活动中添加以下行,如:
ft.addToBackStack(null);
// ft.addToBackStack(Fragment.TAG); // to identify that fragment.
ft.commit();
08-22 19:33:18.990: D/AndroidRuntime(28096): Shutting down VM
08-22 19:33:18.990: W/dalvikvm(28096): threadid=1: thread exiting with uncaught exception (group=0x414592a0)
08-22 19:33:19.000: E/AndroidRuntime(28096): FATAL EXCEPTION: main
08-22 19:33:19.000: E/AndroidRuntime(28096): android.view.InflateException: Binary XML file line #7: Error inflating class fragment
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
08-22 19:33:19.000: E/AndroidRuntime(28096): at com.androidbegin.sidemenututorial.Fragment1.onCreateView(Fragment1.java:20)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.os.Handler.handleCallback(Handler.java:615)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.os.Looper.loop(Looper.java:137)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.app.ActivityThread.main(ActivityThread.java:4898)
08-22 19:33:19.000: E/AndroidRuntime(28096): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 19:33:19.000: E/AndroidRuntime(28096): at java.lang.reflect.Method.invoke(Method.java:511)
08-22 19:33:19.000: E/AndroidRuntime(28096): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
08-22 19:33:19.000: E/AndroidRuntime(28096): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
08-22 19:33:19.000: E/AndroidRuntime(28096): at dalvik.system.NativeStart.main(Native Method)
08-22 19:33:19.000: E/AndroidRuntime(28096): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f04002d, tag null, or parent id 0x0 with another fragment for com.androidbegin.sidemenututorial.WomenList
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285)
08-22 19:33:19.000: E/AndroidRuntime(28096): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
08-22 19:33:19.000: E/AndroidRuntime(28096): ... 19 more
Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f04002d, tag null, or parent id 0x0 with another fragment for com.androidbegin.sidemenututorial.WomenList
E/AndroidRuntime(28096): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285)
E/AndroidRuntime(28096): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
public void onDestroyView() {
super.onDestroyView();
Fragment fragment = (getFragmentManager().findFragmentById(R.id.your_fragment));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
// ft.commitAllowingStateLoss(); //If u want to handle orientation as well
}
private static View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.main, container, false);
} catch (InflateException e) {
e.printStackTrace();
}
return view;
}
ft.addToBackStack(null);
// ft.addToBackStack(Fragment.TAG); // to identify that fragment.
ft.commit();