Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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
Java Android:NullPointerException尝试从其他类访问TextView时_Java_Android_Gps_Android Context - Fatal编程技术网

Java Android:NullPointerException尝试从其他类访问TextView时

Java Android:NullPointerException尝试从其他类访问TextView时,java,android,gps,android-context,Java,Android,Gps,Android Context,我现在正在努力学习android开发。现在我有问题了,我找不到解决办法 应用程序应该获得gps位置并在文本视图中写入坐标 但当gps收到信号时,我会收到一个零点异常 以下代码来自我的MainActivity。GetLocation是我用来获取gps坐标的类 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou

我现在正在努力学习android开发。现在我有问题了,我找不到解决办法

应用程序应该获得gps位置并在文本视图中写入坐标

但当gps收到信号时,我会收到一个零点异常

以下代码来自我的MainActivity。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);
}

由于此处发生了
NullPointerException

viewToChange = (TextView) this.activity.findViewById(R.id.my_position);

活动
,而不是
视图更改
。确保您已正确地传递了
活动
对象。

据我所知,没有从其他类检索活动的标准方法。您可以(选择一个):

  • 将TextView传递给您的方法
  • 使您的方法返回字符串,并在主活动上设置TextView
  • 将上下文传递给类构造函数并正确检索活动
  • 有目的地通过你的活动

如果不提供类和堆栈跟踪的代码,就很难找出问题所在。我猜是因为
这个.activity
GetLocation
类中语法正确,它将activity作为属性。确保此活动变量不为null,并且活动有其内容集。

我想删除“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
}
public GetLocation(FooChangeListener listener){
    this.listener = listener;
}
并在onLocationChanged方法上更改其文本

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

接口:

public interface FooChangeListener {

    void onFooChange(String text);

}
您的主要活动:

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(TextView view){
    //create a global variable and store
    this.view = view
}
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);
}


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

GetLocation在哪里?请发布堆栈跟踪。如果
GetLocation
MainActivity
的内部类,请尝试将
this.activity
更改为
MainActivity。此
请向我们显示您的
activity\u main.xml
布局。您尝试填充的
文本视图上是否有一个
android:id=“@+id/my_position
”?是的,activity\u main.xml:)中有一个android:id=“@+id/my_position”)
我在第一篇文章中添加了GetLocation类。是的,就是这样。现在它正在工作。我用这种方式把观点公之于众。感谢一千次:)