【发布时间】:2015-02-23 14:59:26
【问题描述】:
我的应用程序中有一个Sliding Drawer,并且有HomeFragment、FriendFragment 等片段。现在HomeFragment 有一个map。所以当我在HomeFragment 中时,即按下它然后如果我再次单击同一个按钮,它会崩溃。我的 onCreateView() 中有以下代码
View v = inflater.inflate(R.layout.home_map_activity, null, false);
logcat中的错误是:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #46: Duplicate id 0x7f0a008a, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
at android.app.Activity.onCreateView(Activity.java:4722)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.example.MAPit.MAPit.HomeFragment.onCreateView(HomeFragment.java:79)
at android.app.Fragment.performCreateView(Fragment.java:1695)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
at android.app.BackStackRecord.run(BackStackRecord.java:682)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
所以我检查了HomeFragment 的onCreateView
if (v != null) {
ViewGroup parent = (ViewGroup) v.getParent();
if (parent != null){
parent.removeView(v);
}
}
try {
v = inflater.inflate(R.layout.home_map_activity, null, false);
} catch (InflateException e) {
//I have a toast check here and it's printing with vacant map and not crashing
}
但是进行此检查时,碰巧应用程序没有崩溃,但地图没有出现在HomeFragment中。我调试并看到它没有使布局膨胀,即它正在抛出InflateException。然后我尝试添加这部分在我的HomeFragment 中,但又崩溃了。
public void onDestroyView() {
super.onDestroyView();
Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
}
@Override
public void onPause() {
super.onPause();
if (map != null) {
map = null;
}
}
我已尝试禁用我的列表视图选项,但没有成功。我尝试的是
if(listview.getChildAt(selectedPosition).isEnabled())
{
listview.getChildAt(selectedPosition).setEnabled(false);
}
logcat 中的错误:
Caused by: java.lang.NullPointerException
at com.example.MAPit.MAPit.SlidingDrawerActivity.displayView(SlidingDrawerActivity.java:201)
at com.example.MAPit.MAPit.SlidingDrawerActivity.onCreate(SlidingDrawerActivity.java:138)
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
我的listview onclick实现代码:
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
/**
* Displaying fragment view for selected nav drawer list item
*/
private void displayView(int position) {
switch (position) {
case 0:
fragment = new HomeFragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
break;
case 1:
fragment = new Friend_Search_Fragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
break;
case 2:
fragment = new Groups_Fragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
break;
case 3:
fragment = new Friend_Request_Fragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
Bundle frienddata = new Bundle();
frienddata.putString(Commands.Notification_job.getCommand(), Commands.Friends_Request.getCommand());
fragment.setArguments(frienddata);
break;
case 4:
fragment = new Friend_Request_Fragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
Bundle groupdata = new Bundle();
groupdata.putString(Commands.Notification_job.getCommand(), Commands.Group_Join_Group.getCommand());
fragment.setArguments(groupdata);
break;
case 5:
fragment = new MyWallFragment();
getFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
break;
case 6:
Intent intent = new Intent(SlidingDrawerActivity.this,SignIn.class);
startActivity(intent);
break;
default:
break;
}
startFragment(fragment, position);
}
private void startFragment(Fragment fragment, int position) {
mDrawerLayout.closeDrawer(mDrawerLinear);
if (fragment != null) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container,fragment);
transaction.addToBackStack(null);
transaction.commit();
// update selected item and title, then close the drawer
if (position != -1) {
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
}
/*if(position == 0){
if(mDrawerList.getChildAt(1)!=null)
mDrawerList.getChildAt(1).setEnabled(false);
}*/
//setTitle(navMenuTitles[position]);
//mDrawerLayout.closeDrawer(mDrawerLinear);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
我不知道如何防止两次单击滑动抽屉列表视图中的同一项目。谁能告诉我任何路径?提前谢谢。
【问题讨论】:
-
强烈建议不要使用空的 catch 块。如果您发布实际的错误消息会很有帮助。
-
其实它不是空的。我有一个祝酒词打印在那里。好的。我正在给..
-
我已经编辑了我的帖子
-
发布您的 listView onItemClick 监听器。
-
我已经编辑了我的帖子
标签: android android-fragments slidingdrawer