2015-02-17 2 views
1

Я пытаюсь изучить развитие Android в настоящий момент. Теперь у меня проблема, я не могу найти решение.Android: NullPointerException при попытке доступа к TextView из другого класса

Приложение должно получить позицию gps и записать координаты в текстовом виде.

Но когда сигнал 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); 
} 

Я думаю, что я не могу получить доступ к раскладке из mainactivity в моем классе GetLocation ...:/

UPDATE:

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); 
} 
+0

где ваш сайт GetLocation? –

+0

, пожалуйста, отправьте свой стек Trace. –

+0

Если 'GetLocation' является внутренним классом' MainActivity', попробуйте изменить 'this.activity' на' MainActivity.this' – WojciechKo

ответ

1

Я думаю, что удаление «этого» на «this.activity.findViewById» решит вашу проблему. Создайте глобальную активность и инициализируйте ее на своем конструкторе и используйте ее без «этого».

Я также могу предложить вам более эффективные способы настройки мнения других классов:

Making Посмотреть статический вариант:

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); 
    } 
} 

Содержит глобальный FooChangeListener в вашем классе GetLocation и в вашем конструкторе GetLocation:

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); 

}

Это то, что я могу предложить, надеюсь, что это помогает!

+0

Да, это все. Теперь он работает. Я использовал этот способ, сделав представление открытым. Спасибо за тысячу раз :) – Verdemis

0

Поскольку NullPointerException происходит здесь:

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

это activity, что составляет null, а не viewToChange. Убедитесь, что вы правильно прошли объект activity.

0

Насколько я знаю, нет стандартного способа извлечения вашей деятельности из другого класса. Вы можете (выберите один):

  • Передайте TextView вашему методу.
  • Сделайте свой метод возвратом строки и установите TextView в свой основной вид деятельности.
  • Передайте контекст вашему классу Constructor и правильно восстановите свою деятельность
  • Передайте свою деятельность с намерением.
0

Трудно определить проблему, если вы не указали код классов и стек. Я предполагаю, что с this.activity синтаксически корректен в вашем классе GetLocation, он имеет активность как атрибут. Убедитесь, что эта переменная активности не является нулевой, а активность имеет свой контент.

+0

. Я добавил класс GetLocation в свой первый пост. – Verdemis

Смежные вопросы