我有一个带有三个标签的应用程序.
每个选项卡都有自己的布局.xml文件.main.xml有自己的地图片段.这是应用程序首次启动时显示的那个.
除了在标签之间切换时,一切正常.如果我尝试切换回地图片段选项卡,我会收到此错误.切换到其他选项卡之间和之间的工作正常.
这可能有什么问题?
这是我的主类和我的main.xml,以及我使用的相关类(你也会在底部找到错误日志)
主要班级
package com.nfc.demo;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.Toast;
public class NFCDemoActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
bar.addTab(bar
.newTab()
.setText("Map")
.setTabListener(
new TabListener<MapFragment>(this, "map",
MapFragment.class)));
bar.addTab(bar
.newTab()
.setText("Settings")
.setTabListener(
new TabListener<SettingsFragment>(this, "settings",
SettingsFragment.class)));
bar.addTab(bar
.newTab()
.setText("About")
.setTabListener(
new TabListener<AboutFragment>(this, "about",
AboutFragment.class)));
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
// setContentView(R.layout.main);
}
@Override
protected void onSaveInstanceState(Bundle …Run Code Online (Sandbox Code Playgroud) android illegalargumentexception android-maps android-fragments
我正在为4.0和4.1平板电脑编写一个应用程序,我不想使用支持库(如果不需要),而只使用4.x api.
所以我的目标平台定义为:> = 4.0且<= 4.1
该应用程序具有多窗格布局(两个片段,左侧一个小片段,右侧一个内容片段)和一个带标签的操作栏.
与此类似:

单击操作栏上的选项卡可更改"外部"片段,然后内部片段是具有两个嵌套片段的片段(1.左侧小片段,2.宽内容片段).
我现在想知道替换片段,特别是嵌套片段的最佳做法是什么.ViewPager是支持库的一部分,此类没有本机4.x替代方案.在我看来似乎是"弃用".- http://developer.android.com/reference/android/support/v4/view/ViewPager.html
然后我阅读了Android 4.2的发行说明ChildFragmentManager,这是一个不错的选择,但我的目标是4.0和4.1,所以这也不能使用.
ChildFragmentManager 仅适用于4.2
遗憾的是,即使在整个Android开发人员指南中,也没有任何好的示例显示没有支持库的片段使用的最佳实践; 尤其是关于嵌套片段的一切.
所以我想知道:如果不使用支持库及其附带的所有内容,是否根本不可能使用嵌套片段编写4.1应用程序?(需要使用FragmentActivity而不是Fragment等?) 或者什么是最佳实践?
我目前在开发中遇到的问题正是这个陈述:
Android支持库现在还支持嵌套片段,因此您可以在Android 1.6及更高版本上实现嵌套片段设计.
注意:当布局包含a时,您无法将布局扩展为片段
<fragment>.仅在动态添加到片段时才支持嵌套片段.
因为我在XML中定义了嵌套片段,这显然会导致如下错误:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
Run Code Online (Sandbox Code Playgroud)
目前,我为自己总结一下:即使在4.1上,当我甚至不想以2.x平台为目标时,如果没有支持库,则无法在屏幕截图中显示嵌套片段.
(这实际上可能更像是一个wiki条目而不是一个问题,但也许其他人之前已经管理过它).
更新:
一个有用的答案是:Fragment Inside Fragment
android android-fragments android-support-library android-nested-fragment
我的应用中有3个片段的活动.当按下第一个按钮时,会在Activity中调用一个方法,该方法执行一些不相关的操作然后调用finish().
这会触发onPause()片段,它会执行更多不相关的内容然后调用super.onPause().
然后,应用程序加载它出现的旧Activity(逻辑上跟随视图堆栈),并onDestroyView()在Fragment上调用时突然崩溃并出现以下异常:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to destroy activity {be.niteowl.niteowl.debug/be.niteowl.niteowl.views.activities.VenueActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2793)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2811)
at android.app.ActivityThread.access$2100(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at be.niteowl.niteowl.views.activities.TrackFragment.onDestroyView(TrackFragment.java:161)
at android.support.v4.app.Fragment.performDestroyView(Fragment.java:1665)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:980)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) …Run Code Online (Sandbox Code Playgroud) android ondestroy illegalstateexception android-fragments supportmapfragment
我在Activity中有以下代码,它启动包含片段的布局的对话框.
...
case R.id.pick_resource:
dialog = new Dialog(this);
dialog.setContentView(R.layout.resource_picker);
dialog.setCancelable(true);
dialog.setTitle("Pick a resource");
dialog.show();
Run Code Online (Sandbox Code Playgroud)
这在应用程序启动后第一次运行得非常好,但是当对话框退出并稍后再次调用时,我得到了这个堆栈跟踪:
08-10 10:47:33.990: ERROR/AndroidRuntime(26521): FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #7: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224)
at android.app.Dialog.setContentView(Dialog.java:449)
at org.rhq.pocket.StartActivity.onOptionsItemSelected(StartActivity.java:118)
at android.app.Activity.onMenuItemSelected(Activity.java:2390)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:852)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:956)
at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:174)
at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:85)
at android.view.View.performClick(View.java:3100)
at android.view.View$PerformClick.run(View.java:11644)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:126)
at android.app.ActivityThread.main(ActivityThread.java:3997)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) …Run Code Online (Sandbox Code Playgroud)