Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法获取Android SupportMapFragment_Android_Dictionary - Fatal编程技术网

无法获取Android SupportMapFragment

无法获取Android SupportMapFragment,android,dictionary,Android,Dictionary,我已经看过了一些类似问题的解决方案,但没有一个有效。在下面的代码中,findFragmentById始终返回null。我正在从另一个片段调用MapLocationFragment import android.content.Context; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.Fragment; import android

我已经看过了一些类似问题的解决方案,但没有一个有效。在下面的代码中,findFragmentById始终返回null。我正在从另一个片段调用MapLocationFragment

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MapLocationFragment extends Fragment implements OnMapReadyCallback {
    private String tag;

    private OnFragmentInteractionListener mListener;

    public MapLocationFragment() {}   // Required

    private FragmentActivity context;
    private GoogleMap mMap;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d(tag, "onAttach");
        this.context = (FragmentActivity)context;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tag = this.getClass().getSimpleName();
        Log.d(tag, "onCreate");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(tag, "onCreateView");

        View view = inflater.inflate(R.layout.fragment_map, container, false);

        SupportMapFragment frag1 = (SupportMapFragment) getChildFragmentManager()
              .findFragmentById(R.id.mapFragment);

        mapFragment.getMapAsync(this);

        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        // ...
    }
}
和片段布局(尝试了片段和框架布局)


首先,对于
FrameLayout
,没有
android:name
属性。这是
的一个属性

那么,让我们假设,正如您在问题中所暗示的,您使用的不是
,而是


在这种情况下,您的问题是,在膨胀包含
R.id.mapFragment
的布局之前,您正在尝试查找
R.id.mapFragment
。在使用
findViewById()
findFragmentById()
访问该布局的内容之前,您需要对布局进行充气。

首先,对于
FrameLayout
没有
android:name
属性。这是
的一个属性

那么,让我们假设,正如您在问题中所暗示的,您使用的不是
,而是

在这种情况下,您的问题是,在膨胀包含
R.id.mapFragment
的布局之前,您正在尝试查找
R.id.mapFragment
。在使用
findViewById()
findFragmentById()
访问该布局的内容之前,需要对布局进行充气。

使用:

MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
在xml文件中使用:

<fragment
            android:id="@+id/map"
            android:name="dz.android.grcm.WorkaroundMapFragment"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:fragmentExitTransition="@layout/yourXmlFile" />

在您的舱单中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="packageName"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="23" />

     <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

    <permission
      android:name="packageName.permission.MAPS_RECEIVE"
      android:protectionLevel="signature"/>

    <uses-permission android:name="packageName.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="your_APIKEY_"/>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity android:name="packageName.Time_Picker"
             android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

试试看,希望对你有帮助

使用:

MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
在xml文件中使用:

<fragment
            android:id="@+id/map"
            android:name="dz.android.grcm.WorkaroundMapFragment"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:fragmentExitTransition="@layout/yourXmlFile" />

在您的舱单中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="packageName"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="23" />

     <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

    <permission
      android:name="packageName.permission.MAPS_RECEIVE"
      android:protectionLevel="signature"/>

    <uses-permission android:name="packageName.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="your_APIKEY_"/>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity android:name="packageName.Time_Picker"
             android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>


试试看,希望对你有帮助

创建新的仿真器后,它开始使用getChildFragmentManager()调用工作。感谢您的回答。

在创建了一个新的模拟器之后,它开始使用getChildFragmentManager()调用工作。谢谢您的回答。

我对SupportMapFragment有同样的问题我在gms库中找不到它。解决方案是将此类解决方法MapFragment添加到您的包中:

package dz.android.grcm;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.google.android.gms.maps.MapFragment;;

public class WorkaroundMapFragment extends MapFragment {
    private OnTouchListener mListener;

    @SuppressWarnings("deprecation")
    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
        View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);

        TouchableWrapper frameLayout = new TouchableWrapper(getActivity());

        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));

        ((ViewGroup) layout).addView(frameLayout,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        return layout;
    }

    public void setListener(OnTouchListener listener) {
        mListener = listener;
    }

    public interface OnTouchListener {
        public abstract void onTouch();
    }

    public class TouchableWrapper extends FrameLayout {

        public TouchableWrapper(Context context) {
            super(context);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mListener.onTouch();
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.onTouch();
                    break;
            }
            return super.dispatchTouchEvent(event);
        }
    }
}
然后你这样称呼这个类:

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.inscriptionmed);
        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        // *************Fix Scroll Map*******************************
        if (map == null) {
            map = ((WorkaroundMapFragment) getFragmentManager()
                    .findFragmentById(R.id.map)).getMap();
            map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            map.getUiSettings().setZoomControlsEnabled(true);
            map.setMyLocationEnabled(true);
            mScrollView = (ScrollView) findViewById(R.id.partentScroll); 

            ((WorkaroundMapFragment) getFragmentManager().findFragmentById(
                    R.id.map))
                    .setListener(new WorkaroundMapFragment.OnTouchListener() {
                        @Override
                        public void onTouch() {
                            mScrollView
                                    .requestDisallowInterceptTouchEvent(true);
                        }
                    });

        }

我对SupportMapFragment也有同样的问题。我在gms库中找不到它。解决方案是将此类变通方法MapFragment添加到您的包中:

package dz.android.grcm;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.google.android.gms.maps.MapFragment;;

public class WorkaroundMapFragment extends MapFragment {
    private OnTouchListener mListener;

    @SuppressWarnings("deprecation")
    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
        View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);

        TouchableWrapper frameLayout = new TouchableWrapper(getActivity());

        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));

        ((ViewGroup) layout).addView(frameLayout,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        return layout;
    }

    public void setListener(OnTouchListener listener) {
        mListener = listener;
    }

    public interface OnTouchListener {
        public abstract void onTouch();
    }

    public class TouchableWrapper extends FrameLayout {

        public TouchableWrapper(Context context) {
            super(context);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mListener.onTouch();
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.onTouch();
                    break;
            }
            return super.dispatchTouchEvent(event);
        }
    }
}
然后你这样称呼这个类:

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.inscriptionmed);
        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        // *************Fix Scroll Map*******************************
        if (map == null) {
            map = ((WorkaroundMapFragment) getFragmentManager()
                    .findFragmentById(R.id.map)).getMap();
            map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            map.getUiSettings().setZoomControlsEnabled(true);
            map.setMyLocationEnabled(true);
            mScrollView = (ScrollView) findViewById(R.id.partentScroll); 

            ((WorkaroundMapFragment) getFragmentManager().findFragmentById(
                    R.id.map))
                    .setListener(new WorkaroundMapFragment.OnTouchListener() {
                        @Override
                        public void onTouch() {
                            mScrollView
                                    .requestDisallowInterceptTouchEvent(true);
                        }
                    });

        }

Amir谢谢,我让应用程序使用布局工作,但我想将其更改为单个布局,其余部分为片段。地图是唯一给我带来困难的片段..Amir谢谢,我让应用程序使用布局工作,但我想将其更改为单个布局,其余为片段。地图是唯一一个给我带来困难的片段。谢谢你指出我的错误,在寻找片段引用之前没有膨胀视图(我在文章中相应地修改了代码)。但是,findFragmentById()仍然返回null。感谢您指出我在查找片段引用之前没有扩展视图的错误(我在文章中相应地修改了代码)。但是,findFragmentById()仍然返回null。