安卓:如何通知活动时的片段观点准备好了吗?(Android: how to notify Activ

2019-07-20 07:14发布

我用了一个活动谷歌地图API V2在地图上的第二位置王氏下拉导航。

我务实添加地图,如:

mMapFragment = supportMapFragment.newInstance();
getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.placeHolder, mMapFragment, TAG_MAP)
        .commit(); 

我想获得的GoogleMap ovject,如文档https://developers.google.com/maps/documentation/android/map说,它应该做mMapFragment.getMap()但它返回null。

根据http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.html它,如果片段没有经过onCreateView生命周期事件不见了返回null。

我怎样才能知道,每当这个片段准备好了吗?

编辑:我发现这我怎么知道地图是准备使用SupportMapFragment时习惯?

重写onActivityCreated似乎是一个解决方案,但后来我不得不通过构造函数,而不是用的newInstance(),这有什么区别实例片段?

Answer 1:

我首选的方法是使用一个回调以获取从信号Fragment 。 此外,这是在由Android提出的推荐方法与活动沟通

对于你的榜样,在你的Fragment ,添加接口和注册。

public static interface OnCompleteListener {
    public abstract void onComplete();
}

private OnCompleteListener mListener;

public void onAttach(Context context) {
    super.onAttach(context);
    try {
        this.mListener = (OnCompleteListener)context;
    }
    catch (final ClassCastException e) {
        throw new ClassCastException(context.toString() + " must implement OnCompleteListener");
    }
}

现在,实现你的这个界面 Activity

public class MyActivity extends FragmentActivity implements MyFragment.OnCompleteListener {
    //...

    public void onComplete() {
        // After the fragment completes, it calls this callback.
        // setup the rest of your layout now
        mMapFragment.getMap()
    }
}

现在,无论你的Fragment意味着它的加载,通知你的Activity ,它的准备。

@Override
protected void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // create your fragment
    //...

    // signal that you're done and tell the Actvity to call getMap()
    mListener.onComplete();
}

EDIT 2017年12月5日 onAttach(活动活性) 弃用 ,使用onAttach(上下文上下文)来代替。 上面的代码进行调整。



Answer 2:

除了柯克的答案 :因为public void onAttach(Activity activity)已经过时,你现在可以简单地使用:

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity activity;

    if (context instanceof Activity){

        activity=(Activity) context;

        try {
            this.mListener = (OnCompleteListener)activity;
        } catch (final ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnCompleteListener");
        }
    }
}

其余保持不变......有人可能会想使用(Fragment sender)虽然作为参数,并总是通过this



Answer 3:

我不知道我完全理解你的问题,但我已经在那里我使用导航下拉菜单类似的设置。 下面是我的什么作品:

1。)从XML文件加载片段并调用setupMapIfNeeded()

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.basicMap);

setUpMapIfNeeded();

下面是引用的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/basicMap"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment" />

2。)然后被设定在地图上(对于isGoogleMapsInstalled(细节),参见这个问题 )

    private void setUpMapIfNeeded() 
    {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) 
    {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap();
        // Check if we were successful in obtaining the map.
        if(isGoogleMapsInstalled())
        {
            if (mMap != null) 
            {
                mMap.setOnCameraChangeListener(getCameraChangeListener());
                mMap.setInfoWindowAdapter(new MyCustomInfoWindowAdapter(this));
            }
        }
        else
        {
            MapConstants.showDialogWithTextAndButton(this, R.string.installGoogleMaps, R.string.install, false, getGoogleMapsListener());
        }
    }
    }

3)确保您也呼吁从的onResume setUpMapIfNeeded()():

public void onResume()
{
    super.onResume();

    setUpMapIfNeeded();
}


Answer 4:

如果你想这样做没有任何监听器:

添加片段与TAG

 supportFragmentManager
                .beginTransaction()
                .add(R.id.pagerContainer, UniversalWebViewFragment.newInstance(UniversalWebViewFragment.YOUTUBE_SERACH_URL+"HD trailers"), 
                "UniversalWebView")
                .disallowAddToBackStack()
                .commit()

创建托管Activity类要加载片段后调用的公共方法 。 在这里,我回电话我例如片段的方法

public fun loadURL() {
        val webViewFragment = supportFragmentManager
                              .findFragmentByTag("UniversalWebView") 
                               as UniversalWebViewFragment

        webViewFragment.searchOnYoutube("Crysis Warhead")
    }

现在里面onViewCreated您的片段的方法,你可以简单地调用这样的主机活动的公共方法:

    (activity as HomeActivity ).loadURL()


文章来源: Android: how to notify Activity when Fragments views are ready?