标签: fragmentmanager

如何在片段中访问getSupportFragmentManager()?

我有一个FragmentActivity,我想在其中使用一个地图片段.我在获取支持片段管理器访问它时遇到问题.

 if (googleMap == null) {
            googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map1)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("Hello Maps ");

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(latitude, longitude)).zoom(15).build();

            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            // adding marker
            googleMap.addMarker(marker);
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-fragmentactivity android-support-library fragmentmanager

139
推荐指数
10
解决办法
20万
查看次数

Android FragmentManager BackStackRecord.run抛出NullPointerException

使用Fragments时,我有时会遇到以下异常:

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:591)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

当调用from时,当它尝试从管理器中删除片段时run(),会发生异常.BackStackRecordexecPendingTransactions()

case OP_REMOVE: {
  Fragment f = op.fragment;
  f.mNextAnim = op.exitAnim; <----
  mManager.removeFragment(f, mTransition, mTransitionStyle);
}
break;
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚究竟是什么导致了这个?我认为这与拆除碎片时未正确清理的碎片堆叠有关.

java android android-fragments fragmentmanager

65
推荐指数
1
解决办法
3万
查看次数

onAttach()未在Fragment中调用

My Fragment onAttach(context)在启动时不会调用方法AppCompatActivity.

以XML格式创建片段:

<fragment
    android:id="@+id/toolbar"
    class="package.MainToolbarFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout="@layout/fragment_main_toolbar" />
Run Code Online (Sandbox Code Playgroud)

但如果我扩展它support.v4.Fragment,onAttach(context)请致电!

可能是什么问题呢?

当然,我可以扩展所有片段 v4.Fragment,但我不想要它.这是不好的做法吗?同时项目min sdk 14.

android android-fragments android-activity android-support-library fragmentmanager

64
推荐指数
2
解决办法
2万
查看次数

FragmentManager和FragmentTransaction到底做了什么?

我在下面有简单的代码

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

这些代码行做了什么?

android fragmenttransaction fragmentmanager fragment-backstack

49
推荐指数
2
解决办法
7万
查看次数

在提交FragmentTransaction之前检查状态是否已保存

我有时会看到以下用于提交的堆栈跟踪,当用户没有查看活动时(状态保存后)可能会发生这种情况:

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)
Run Code Online (Sandbox Code Playgroud)

看看Android源代码,这很有意义:

private void checkStateLoss() {
        if (mStateSaved) {
            throw new IllegalStateException(
                    "Can not perform this action after onSaveInstanceState");
        }
        if (mNoTransactionsBecause != null) {
            throw new IllegalStateException(
                    "Can not perform this action inside of " + mNoTransactionsBecause);
        }
 }
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否有任何方法(除了在(保存/恢复)InstanceState中存储类变量)以检查片段是否将以不合需要的状态提交,这样我可以存储事务以供日后使用在适当的时候提交.

android android-fragments fragmentmanager android-savedstate onsaveinstancestate

41
推荐指数
3
解决办法
2万
查看次数

无法解析方法'show(android.support.v4.app.FragmentManager,java.lang.String)

出于某种原因,当我尝试显示一个Dialog时,我从dialog.show(fm,DIALOG_DATE)收到错误; 说无法解析方法'show(android.support.v4.app.FragmentManager,java.lang.String)'

为什么不能解决方法?

mDateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            FragmentManager fm = getActivity().getSupportFragmentManager();
            DatePickerFragment dialog = new DatePickerFragment();
            dialog.show(fm, DIALOG_DATE);
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是我班上的其他人:

package com.bignerdranch.android.criminalintent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.text.Editable; 
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;

import java.util.UUID;


public class CrimeFragment extends Fragment {
//key for the extra
public static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id";

private static final String DIALOG_DATE = "date"; …
Run Code Online (Sandbox Code Playgroud)

java android dialog fragment fragmentmanager

38
推荐指数
1
解决办法
4万
查看次数

点击片段后面的隐形布局:

我创建了几个片段,并按以下方式添加第一个片段:

mainFragment = (MainFragment) MainFragment.create();
    getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    .add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG)
    .commit();
Run Code Online (Sandbox Code Playgroud)

第二个片段以这种方式添加:

     getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    //.hide(mainFragment)
    .add(R.id.content,VenueFragment.create(vid), "Venue Fragment")
    .addToBackStack(null)
    .commit();
    setDrawerIndicatorEnabled(false);
Run Code Online (Sandbox Code Playgroud)

现在你看到hide方法没有应用于这个事务,并且VenueFragment打开了,在这种情况下的问题是,当VenueFragment按下这个片段的空部分时打开(并且它是一个全屏视图)调用MainFragment可点击视图的调用.我怎么能阻止这个?

如果我使用隐藏选项,那么它不会发生,但由于某种原因,删除它的动画MainFragment正在上升,这会产生一种奇怪的体验.

android android-fragments fragmenttransaction fragmentmanager

27
推荐指数
3
解决办法
1万
查看次数

使用(Child)FragmentManager正确使用子子片段

如何正确使用碎片中的碎片?

我的(简化)用例如下,我有一个带有布局片段的活动,这个片段自己包含一个子片段...所有片段都手动添加到他们的父母......

----------------------------------------------------------
- Activity                                               -
-                                                        -
-                                                        -
-     ---------------------------------------            -
-     - Fragment                            -            -
-     -                                     -            -
-     -    -----------------                -            -
-     -    - SubFragment   -                -            -
-     -    -               -                -            -
-     -    -               -                -            -
-     -    -----------------                -            -
-     ---------------------------------------            -
-                                                        -
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

现在在我的活动中onCreate我做了以下事情:

if (savedInstanceState == null)
{
    // I create the fragment
    mMainFragment = new MainFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_main, mMainFragment); …
Run Code Online (Sandbox Code Playgroud)

android fragment fragmentmanager

20
推荐指数
1
解决办法
2万
查看次数

即使在添加addToBackStack和executePendingTransactions()之后,getBackStackEntryCount()也始终返回0

我有两个活动A和B.活动A有一个mapFragment,我将它添加到backstack.当我从B回到Actvity A时,我希望片段显示的状态与我离开时相同.但getFragmentManager().getBackStackEntryCount()返回0.这是我的代码:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.replace(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)

从活动B返回时,我知道getBackStackEntryCount()的数量:

System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());
Run Code Online (Sandbox Code Playgroud)

这显示我0.

提前致谢.

android fragmentmanager

20
推荐指数
2
解决办法
1万
查看次数

将数据从当前片段传回到先前的片段

我在我的应用程序中使用导航抽屉.我有一个MainActivity,其余的是片段.所以问题是假设我有三个片段,如A,B,C.

现在在A我有一个按钮,我从A> B发送数据.
例如putSring("datafrom A","data from A");
现在在B中我从A接收数据.
我在B中有一个按钮,我从B> C发送数据.
例如putSring("datafrom B","data from B");
现在在C中我从B接收数据.
然后,我在C中有一个Button,并从C> B发送数据.
例如putSring("data from C","data from C");

所以,似乎在B中我从两个不同的片段获取数据.我尝试了所有使用活动,它与startActivityforresult配合得很好.但是,当所有碎片都是碎片时我怎么能管理.

android fragment android-fragments fragmentmanager

15
推荐指数
2
解决办法
1万
查看次数