我目前正在尝试学习android开发。现在我有问题,我找不到解决方案。

该应用程序应获取gps位置,并在textview中写入坐标。

但是当gps收到信号时,我得到了NullPointerException。

以下代码来自我的MainActitvity。 GetLocation是我的类,用于获取gps坐标。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    GetLocation getMyLocation = new GetLocation();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, getMyLocation);

}


这是我的GetLocation类中发生错误的部分。该错误发生在带有findViewById的行中

 public void onLocationChanged(Location location) {

    location.getLatitude();
    location.getLongitude();

    String myLocation = location.getLatitude() + " " + location.getLongitude();

    viewToChange = (TextView) this.activity.findViewById(R.id.my_position);
    viewToChange.setText("Position " + myLocation);
}


我想我无法从GetLocation类的mainactivity中访问布局...:/

更新:

public class GetLocation implements LocationListener {
TextView viewToChange;
private Activity activity;

private void onCreate(){
}

public void GetLocation(Activity _activity){
    this.activity = _activity;
}

@Override
public void onLocationChanged(Location location) {

    location.getLatitude();
    location.getLongitude();

    String myLocation = location.getLatitude() + " " + location.getLongitude();

    viewToChange = (TextView) this.activity.findViewById(R.id.my_position);
    viewToChange.setText("Position " + myLocation);
}

最佳答案

我猜想删除“ this.activity.findViewById”上的“ this”将解决您的问题。创建一个全局活动,并在构造函数上对其进行初始化,并在不使用“ this”的情况下使用它。

我还可以建议您更有效地自定义其他类的视图的方法:

将视图设为公共静态是一种选择:

public class MainActivity extends Activity{

public static TextView textViewToChange;

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

    textViewToChange = (TextView) findViewById(R.id.textViewToChange);

    }
}


在您的GetLocation类中,您可以通过以下方式访问它:

MainActivity.textViewToChange.setText("someText");


您可以通过构造函数将视图传递给GetLocation:

public GetLocation(TextView view){
    //create a global variable and store
    this.view = view
}


并在onLocationChanged方法上更改其文本。

您还可以创建一个接口并让您的MainActivity实现它,并在进行更改时从GetLocation触发它:

接口:

public interface FooChangeListener {

    void onFooChange(String text);

}


您的MainActivity:

public class MainActivity extends Activity implements FooChangeListener {

    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView);
    }

    @Override
    public void onFooChange(String text) {
        tv.setText(text);
    }
}


在您的GetLocation类和GetLocation构造函数中创建一个全局FooChangeListener:

public GetLocation(FooChangeListener listener){
    this.listener = listener;
}


并在您的onLocationChanged中:

public void onLocationChanged(Location location) {

    location.getLatitude();
    location.getLongitude();

    String myLocation = location.getLatitude() + " " + location.getLongitude();

    listener.onFooChange(myLocation);


}

这些是我可以建议的,希望对您有所帮助!

09-18 09:01