当我第二次打开我的SupportMapFragment(Android maps v2)(调用setContentView)时,我收到以下错误:
01-28 16:27:21.374: E/AndroidRuntime(32743): FATAL EXCEPTION: main
01-28 16:27:21.374: E/AndroidRuntime(32743): android.view.InflateException: Binary XML file line #6: Error inflating class fragment
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.view.View.inflate(View.java:16119)
01-28 16:27:21.374: E/AndroidRuntime(32743): at mypackage.MyView.<init>(HitsView.java:26)
01-28 16:27:21.374: E/AndroidRuntime(32743): at mypackage.MenuListFragment.onItemClick(MenuListFragment.java:133)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
01-28 16:27:21.374: E/AndroidRuntime(32743): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
01-28 16:27:21.374: E/AndroidRuntime(32743): …Run Code Online (Sandbox Code Playgroud) 我遇到了困扰我好几天的问题.
ViewPager主要活动中有一个持有3 Fragment秒作为标签片段.在第一个片段中有一个ListView包含一些视图,哪个是最重要的视图,另一个视图ViewPager.我想在子中保存一些照片ViewPager,并在这里使用更多片段.
现在有麻烦:
当第一个 Fragment停止时(父节点中的第三个片段在ViewPager屏幕上显示)并恢复(用户切换到第二个片段),应用程序崩溃,调试器说:
java.lang.IllegalArgumentException: No view found for id 0x7f05008b (com.example.viewpager:id/sub_viewpager) for fragment ScreenSlidePageFragment
Run Code Online (Sandbox Code Playgroud)
我已经使用了,getChildFragmentManager()因为这是嵌套片段的情况.
以下是与父ViewPager中第一个片段对应的列表适配器的关键代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
switch (type) {
case TYPE_BANNER:
if (convertView == null) {
convertView = mBannerView.getBannerView(parent);
}
mBannerView.update(convertView);
break;
case TYPE_ITEM:
break;
}
return convertView;
}
Run Code Online (Sandbox Code Playgroud)
这是代码mBannerView …
我有一个Fragment设置a ListView并创建一个定期Handler更新Listview.然而,看起来它Handler仍然在Fragment被破坏后运行.
以下是代码.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//boilerplate code
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
assignAdapter();
handler.postDelayed(this, 15000);
}
});
return v;
}
Run Code Online (Sandbox Code Playgroud)
ListView销毁之后更新Fragment会导致应用程序崩溃.如何Handler在Fragment被摧毁时使其停止?我也想知道如果有任何暂停应用程序的影响Handler也是如此.
android listview android-lifecycle android-fragments fragment-lifecycle
您可能知道Android支持嵌套片段,也可以通过API级别为17的支持库.所以基本上我正在尝试将嵌套片段添加到ViewPager的一个片段中,并熟悉这个新的好功能.
在第一次应用程序启动时,一切都按预期工作,即我可以添加子片段,浏览这些片段,处理后栈等.
但问题是当我通过单击"返回"按钮离开应用程序并重新启动应用程序时,我在大多数情况下得到以下异常,并非总是如此:
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.addChildFragment(FragWrapper.java:145)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.onActivityCreated(FragWrapper.java:96)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15172)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
at android.view.View.measure(View.java:15172)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615) …Run Code Online (Sandbox Code Playgroud) 我试图在viewpager中的另一个片段中添加一个片段getChildFragmentManager().我得到了以下错误,
java.lang.IllegalStateException:Activity已在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1549)的android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:654)在android下被销毁.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:625)at com.lakeba.gameon.userprofile.UserProfileContainerFragment.replaceFragment(UserProfileContainerFragment.java:72)
我试过这个解决方法,但仍然得到相同的错误.
UserProfileContainerFragment.java
public class UserProfileContainerFragment extends CustomFragment {
private View rootView;
private Fragment fragment1;
public UserProfileContainerFragment() {
// Required empty public constructor
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public static UserProfileContainerFragment newInstance() {
UserProfileContainerFragment fragment = new UserProfileContainerFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
rootView = inflater.inflate(R.layout.fragment_user_profile_container, container, false);
if(savedInstanceState == null) {
UserProfileFragment …Run Code Online (Sandbox Code Playgroud) 完整的堆栈仅包含android核心代码:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
at androidx.fragment.app.Fragment.performDetach(Fragment.java:2844)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1033)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1237)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:434)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2075)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1865)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1820)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1726)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Run Code Online (Sandbox Code Playgroud)
在主活动中替换片段时会发生这种情况:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
at androidx.fragment.app.Fragment.performDetach(Fragment.java:2844)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1033)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1237)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:434)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2075)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1865)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1820)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1726)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at …Run Code Online (Sandbox Code Playgroud) 根据谷歌的文档:
您现在可以将片段嵌入片段中.这对于您希望将动态和可重用UI组件放入自身动态且可重用的UI组件的各种情况都很有用.例如,如果使用ViewPager创建 向左和向右滑动并占用大部分屏幕空间的 片段,则现在可以将片段插入到每个片段页面中.要嵌套片段,只需在要添加片段的片段上调用getChildFragmentManager().这将返回一个FragmentManager,您可以像通常从顶级活动那样使用它来创建片段事务.例如,这里有一些代码可以在现有的Fragment类中添加一个片段:
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
Run Code Online (Sandbox Code Playgroud)
所以我创造了自己的PageFragment.而我PageFragmentAdapter的3页PageFragment.我还有6个片段:Fragment1,Fragment2,Fragment3,FragmentA,FragmentB,FragmentC.在我的MainActivity初始化我的六个片段,我ViewPager和它PageFragmentAdapter(它PageFragment自己初始化三个).
然后,我用这个方法来附上我的Fragment1,Fragment2,Fragment3每个页面(每个PageFragment的)PageFragmentAdapter:
PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);
Run Code Online (Sandbox Code Playgroud)
我可以回复(通过方法PageFragmentAdapter)片段并将"嵌套片段"放入我的PageFragment(当然onCreate())中,如:
getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
注意:我用它PageFragment.setNestedFragment() …
android nested android-fragments android-viewpager fragmentpageradapter
两天了,我正试图解决这个问题.我在网上和stackoverflow上搜索过,但我找不到我的问题的答案.
在我的应用程序中,我正在尝试实现两个选项卡.一个需要显示一个地图,在另一个选项卡中我将显示一个列表适配器.(使用ActionBarSherlock)
当我单击第二个选项卡然后单击第一个选项卡时,我得到一个例外:
10-08 01:27:45.203:E/AndroidRuntime(7082):java.lang.IllegalStateException:活动已被破坏
这是我的活动代码和我的片段类.(仅用于测试,我将CustomMapFragment类放两次).
public class MapActivity extends SherlockFragmentActivity implements LocationListener,TabListener{
LatLng mLocation;
GoogleMap map;
//CustomMapFragment fragment1 = new CustomMapFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
setActionBar();
//fragment2 = new Fragment2();
//FragmentTransaction ft = fm.beginTransaction();
//ft.add(R.id.container, fragment1, "frag1");
//ft.add(R.id.fragment_container, fragment2, "frag2");
//ft.commit();
}
}
private void setActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
CustomMapFragment frag1 = new CustomMapFragment();
CustomMapFragment frag2 = …Run Code Online (Sandbox Code Playgroud) 我没有使用ViewPager,并且是我唯一拨打任何电话的地方Fragment交易是单击活动布局中导航栏上的按钮。
当我太快地切换到片段(如来回)时,会出现以下异常:
java.lang.IllegalStateException:没有活动
似乎是当我单击切换另一个Fragment而第一个尚未完全完成加载时。我正在使用FragmentActivity。
谁能对此有所了解?
我要切换Fragment的代码:
fragmentManager.beginTransaction()
.replace(R.id.container, old,
fragment.getClass().getSimpleName())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();
Run Code Online (Sandbox Code Playgroud)
编辑:取出过渡解决了问题,但我想知道是否有一种方法可以实现过渡。我的理论是,过渡会延迟片段的生命周期,并在启动另一个片段事务时使活动为空。
我正在使用嵌套片段和片段加载良好.但是当我在此frameLayout中加载另一个片段并想要再次加载嵌套片段时,我的应用程序正在崩溃.
07-14 16:58:21.272: E/AndroidRuntime(1813): java.lang.IllegalStateException: Activity has been destroyed
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
07-14 16:58:21.272: E/AndroidRuntime(1813): at me.kaidul.uhunt.Fragment1.onCreateView(Fragment1.java:23)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
07-14 16:58:21.272: E/AndroidRuntime(1813): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
Run Code Online (Sandbox Code Playgroud)
我的父级Fragment类:
public class Fragment1 extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment1, …Run Code Online (Sandbox Code Playgroud) 我知道有几个类似的问题.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new LoginFragment()).commit();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "DZActivity onSaveInstanceState");
}
@Override
public void onRequestStarted() {
DZActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "DZActivity onRequestStarted");
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProgressFragment()).commit();
}
});
}
@Override
public void onSignIn(String accessToken) {
DZActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "DZActivity onSignIn");
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
}
});
}
Run Code Online (Sandbox Code Playgroud)
按下后退我第二次启动我的应用程序,在按"登录"后,我得到:
08-07 18:02:54.609: I/DZActivity(3302): DZActivity onCreate
08-07 18:02:54.659: I/DZActivity(3302): DZActivity onResume …Run Code Online (Sandbox Code Playgroud)