【问题标题】:Accessing method from a Fragment in Button Click from MainActivity从 MainActivity 的 Button Click 中的 Fragment 访问方法
【发布时间】:2016-01-13 23:19:29
【问题描述】:

伙计们,

我正在尝试通过单击 MainActivity 中的按钮将用户当前的纬度和经度发送到 MapFragment(Fragment)。我使用在MainActivity 中实现的片段中的接口,但是当我尝试从片段onButtonClick 访问该方法时,我得到一个

在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void com.xtechkid.blah.threadingapplication.MapDemoActivity.setupCurrlocation(com.google.android.gms.maps.model.LatLng)' 在 com.xtechkid.sudheej.threadingapplication.MainActivity.findLocation(MainActivity.java:67)

我的代码在下面

这是地图片段

public class MapDemoActivity extends Fragment {
final LatLng MU = new LatLng(40.8874245, 67.0200729);
private GoogleMap mMap; // Might be null if Google Play services APK is not available.
CommInter mCallback;
public interface CommInter {
    public void communicatesWithActivity(double lati,double longi);
}


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

    Activity a;

   // if (context instanceof Activity){
        a=(Activity) context;
    //}

    try{
        mCallback = (CommInter) a;
    }catch (ClassCastException e){
        throw new ClassCastException(a.toString());
    }
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);

    //setUpMapIfNeeded();

    if (mMap != null) {
        mMap.setMyLocationEnabled(true);
    }

    return view;
}
//This method when called from Main is throwing Exception
public void setupCurrlocation(LatLng MUSEUM) {
    makeText(getContext(), "I am inside the function ", Toast.LENGTH_LONG).show();
    System.out.println("I am inside the function");
    /*CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(MUSEUM)
            .zoom(10)
            .bearing(70)
            .tilt(25)
            .build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
*/
    }

}

主要活动的代码

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends AppCompatActivity implements       MapDemoActivity.CommInter  {

private TextView txtLocation;
private String provider;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
public void communicatesWithActivity(double lati, double longi) {
    MapDemoActivity mapFrag = (MapDemoActivity)getSupportFragmentManager().findFragmentById(R.id.map);
    final LatLng MUSEU = new LatLng(38.8874245, 77.0200729);
    //final LatLng MUSEU = new LatLng(lati, longi);
    mapFrag.setupCurrlocation(MUSEU);
}

public void findLocation(View v) {
    //final LatLng setLoc =  new LatLng(38.8874245, -77.0200729);
   //// MapDemoActivity fragment;
   // Fragment t = (Fragment)getSupportFragmentManager()findViewById(R.id.map);
   // fragment.setupCurrlocation(v,setLoc);
    txtLocation = (TextView) findViewById(R.id.textViewLocation);
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean isLocEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (!isLocEnabled) {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivity(intent);
    }

    GPSTracker gps = new GPSTracker(MainActivity.this);

    // check if GPS enabled
    if(gps.canGetLocation()){

        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();

        // \n is for new line

        Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
        txtLocation.setText("Lat: " + latitude + "Long: " + longitude);

        //System.out.println(MUS);
        //The PROBLEM IS HERE I DONT KNOW THE FIX 
        communicatesWithActivity(latitude,long);


    }else{
        // can't get location
        // GPS or Network is not enabled
        // Ask user to enable GPS/network in settings
        gps.showSettingsAlert();
    }


    }

}

【问题讨论】:

  • findFragmentById(R.id.map) 返回空值。你的 activity_main.xml 中真的有一个 id 为“map”的片段吗?

标签: java android google-maps android-fragments


【解决方案1】:

您没有使用谷歌地图。您需要在调用 setupcurrlocation 的位置进行所有这些导入。

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
// et al...

public void setupCurrlocation(LatLng MUSEUM) {
    GoogleMap googleMap = ((MapFragment) fragmentManager.
                    findFragmentById(R.id.map)).getMap();
    googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    Marker marker = googleMap.addMarker(new MarkerOptions().position(latLng).title(null));
    CameraPosition cameraPosition = new CameraPosition.Builder().target(MUSEUM).zoom(10).bearing(70).tilt(25)
                            .build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

}

基本上我会在片段附加到的活动中使用此方法。然后,您需要管理谷歌地图的可见性。因为它将保留在其他片段之上。
通过控制框架布局的可见性,您可以控制地图在其框架布局内的可见性。

例子:

// your activity layout here:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    //TO DO/>

    <RelativeLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:id="@+id/myrellayout">

        // ALL THE THINGS IN YOUR ACTIVTY

    </RelativeLayout>

    // THE FRAMELAYOUTS MANAGE YOUR MAP FRAGMENT AND OTHER FRAGMENTS VISIBILITY

    <FrameLayout
        android:id="@+id/firstfrag"
        android:layout_below="@+id/myrellayout"
        android:layout_height="fill_parent"
        android:layout_width="match_parent"
        android:visibility="gone"/>

    <FrameLayout
        android:id="@+id/secondfrag"
        android:layout_below="@+id/myrellayout"
        android:layout_height="fill_parent"
        android:layout_width="match_parent"
        android:visibility="gone"/>

        <fragment
            android:id="@+id/map"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:name="com.google.android.gms.maps.MapFragment"/>
    </FrameLayout>
</RelativeLayout>

https://developers.google.com/maps/documentation/android-api/ https://developers.google.com/maps/documentation/javascript/examples/

【讨论】:

    【解决方案2】:

    由于findFragmentById 返回 null,Activity 中发生异常。根据您发布的代码,您已在 xml 中声明了您的 Fragment。由于您使用的是getSupportFragmentManager,请确保您使用com.google.android.gms.maps.SupportMapFragment 声明它,而不是使用com.google.android.gms.maps.MapFragment。这可能是您获得空值的原因之一。另一方面,您可以使用事务处理

    私有 MapDemoActivity mFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            mFragment = new MapDemoActivity(); 
            getSupportFragmentManager().beginTransaction().replace(R.id.container, mFragment, "TAG").commit();
        } 
    }
    

    然后你可以使用mFragment。在您的 xml 中,您必须将 &lt;fragment 替换为普通的 ViewGroup,例如 FrameLayout id container

    【讨论】:

      【解决方案3】:

      您好,您可以尝试另一种方法,例如在您的片段类中创建一个公共静态方法,然后从您的活动类单击按钮以所需的纬度和经度调用此方法。

      /*
       *  Get User Desired Location in fragment class */
      public static void getLocation(double lati, double longi)
      {
          try {
              CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(lati, longi));
              CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
              googleMap.moveCamera(center);
              googleMap.animateCamera(zoom);
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      
      /* Get Desired Location in your activity class*/
      btnCurrentLocation.setOnClickListener(new OnClickListener()
      {
          @Override
          public void onClick(View v) 
          {
              ClassName.getLocation(lati, longi); 
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 2016-12-26
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多