2012-01-21 3 views
0

У меня есть макет в xml.Как я могу получить постоянную ссылку на представление? (android)

В моей деятельности, в OnCreate метод я получить ссылку на мнение я хочу, чтобы периодически обновлять, как это:

TextView MYTEXT = (TextView) findViewById (R.id.textview1);

Затем, в периодическом способе, я это сделать:

myText.setText (Float.toString (MyData));

Он отлично работает, пока экран не вращается.

Я прочитал, что, когда экран вращается, макет воссоздается, и все виды макета воссозданы, поэтому старые ссылки не работают.

Мой код:

private TextView myText; //Its a class member 

public void onCreate(Bundle savedInstanceState) { 
    //Other things 
    myText = (TextView)findViewById(R.id.textview1); 
    //Other things 
} 

//This is the periodic method, it occurs many times per second 
public final void onSensorChanged(SensorEvent event) { 
    myText.setText(Float.toString(event.myData)); 
    //This setText works fine until the screen rotation 
} 

Как я могу иметь постоянную ссылку на представление? И как я могу узнать, когда экран повернулся?

Thanx

+0

Что значит «старые ссылки не работают»? Вы получаете исключение? – Korbi

+0

В коде там «myText» хранится ссылка на TextView. Но когда экран вращается, этот TextView уничтожается, а другой TextView заменяет его в новом макете (создаваемом при ротации), поэтому myText теперь ссылается на несуществующий TextView. – Alex

+0

Но где вы устанавливаете переменную-член myText? В вашем примере кода вы устанавливаете локальный. Можете ли вы показать нам больше кода? –

ответ

1

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

В точке поворота вам нужно будет получить указатель на вновь созданный объект.

Для определения изменений ориентации, связанных с использованием макета, используйте OnConfigurationChanged, как показано в этом сообщении.

How to detect orientation change in layout in Android?

+0

Thanx, это сделало работу. :) – Alex

0

Просто используйте переменную экземпляра инициализирован в OnCreate(). Если вы ленивы выполнения findViewById(), вы можете использовать мой маленький инжектор библиотека:

https://github.com/ko5tik/andject

1

Вы регистрацией вашего датчика слушателя в вашем onPause()? Я думаю, что вы должны получать сенсорные события между уничтожением вашего представления и вызовом onCreate(). (Вы можете попытаться установить некоторые точки останова, чтобы увидеть, происходит ли это.)

Посмотрите на the code on this page, как это сделать.

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

Вам не нужно беспокоиться о onConfigurationChanged(), а документы Android поощряют вас не путаться с этим.

+0

Да, управление sensorListener я думаю, что я делаю это правильно, с методами onPause и onResume, проблема была только ссылкой на View, но я решил ее с помощью onConfigurationChanged. Как вы думаете, что это можно сделать? Я хочу научиться делать это правильно, пока это работает, но если вы считаете, что это можно сделать по-другому, скажите мне, пожалуйста :) – Alex

+0

Когда вы сами справляетесь с этим событием, вы вообще не мешаете отдыху. Вы скрыли ошибку, а не исправили ее. Этот отказ может по-прежнему возникать, когда ваше приложение перезапускается по другим причинам (например, с переключением задач с низкой памятью). Документы говорят, что обработка onConfigurationChanged() сама ["должна считаться последней инстанцией"] (http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange). –

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