2015-12-12 2 views
2

Я тяну свои волосы за это уже несколько часов.Android - как обновить текстовое изображение из другого класса

У меня устройство Android Wear, где я отслеживал данные датчика. Я успешно отправил эти данные на сопряженный смартфон, я вижу сообщения, отображаемые в logcat на телефоне.

Тем не менее, я пытаюсь добавить текстовое представление на телефоне, чтобы отображать данные датчика, но когда я вызываю textview.append(), он вылетает с исключением из null-указателя.

Ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference

listenerService, что прослушивает изменения, по телефону. Это делает работу, я получаю правильную информацию в LogCat:

public class ListenerService extends WearableListenerService { 

@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
    retrieveMessage(messageEvent.getPath()); 
} 

private void retrieveMessage(String message) { 
    MainActivity sensorData = new MainActivity(); 
    sensorData.appendData(message); 
} 

и методы приема в моем MainActivity, даже получить правильное «сообщение» здесь в LogCat:

public void appendData(String message) { 

    Log.d("MESSAGE", message); 
    sensorList.append("\n" + " DISPLAY PLS : " + message); 
} 

Я правильно раздули расположение внутри метода OnCreate() в моем MainActivity и я могу добавить к этому TextView внутри этого метода:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
... 
sensorList = (TextView) findViewById(R.id.sensorListView); 
    sensorList.setText("\n" + "On create"); 

Любая идея относительно того, что я делаю неправильно?

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/DrawerLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:elevation="7dp"> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <include 
     android:id="@+id/tool_bar" 
     layout="@layout/tool_bar"> 
    </include> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/sensorListView" 
     android:layout_gravity="center_horizontal|top" 
     android:layout_marginTop="100dp" 
     android:text="Sensors" /> 
</FrameLayout> 
<android.support.v7.widget.RecyclerView 
    android:id="@+id/RecyclerView" 
    android:layout_width="320dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="left" 
    android:background="#ffffff" 
    android:scrollbars="vertical"> 
</android.support.v7.widget.RecyclerView> 

+0

Не могли бы вы добавить полный стек и присвоенные номера строк ? – Domin

+0

Возможно, вы можете использовать интерфейс с обратным вызовом для установки текстового поля. Это похоже на пример «взаимодействие с фрагментами» на документах Android. –

+0

На самом деле, ваша проблема заключается в том, что вы явно делаете новое действие в 'new MainActivity();' Разве вы не должны делать намерение начать MainActivity и передавать свои данные через это? –

ответ

1

Вы можете достичь своей цели с BroadcastReceiver, вот пример кода:

Телефон Side

public MainActivity extends Activity { 

    ... 

    public static final String ACTION_TEXT_CHANGED = "changed"; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ... 
     sensorList = (TextView) findViewById(R.id.sensorListView); 
     sensorList.setText("\n" + "On create"); 
     ... 
     LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter(ACTION_TEXT_CHANGED)); 
    } 

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String content = intent.getStringExtra("content"); 
      sensorList.setText(""); 
     } 
    }; 

} 


public class ListenerService extends WearableListenerService { 

    ... 

    public static final String ACTION_TEXT_CHANGED = "changed"; 

    ... 

    @Override 
    public void onMessageReceived(MessageEvent messageEvent) { 

     ... 
     retrieveMessage(message); 
     ... 
    } 

    private void retrieveMessage(String message) { 
     Intent intent = new Intent(); 
     intent.setAction(ACTION_TEXT_CHANGED); 
     intent.putExtra("content", message); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 
} 
+0

спасибо, у меня была идея, что это нужно делать с BroadcastReceiver в порядке, но я не мог понять это. Еще раз спасибо. – mangledBadger

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