這實際上是一個看似「簡單」的問題,但實際上這是一個在Android開發環境下的複雜問題。
活動「過程入口點」,意思是你看不到任何活動可以作爲「入口的第一點您在啓動應用程序」行爲。人們認爲只有具有MAIN/LAUNCHER
意圖過濾器的活動可以在啓動時啓動,但這是錯誤的。
任何活性可充當「第一活動」,因爲可以的Android從與當前激活導航堆棧的任意點重新啓動它。
無論如何,考慮到這一點,一個活動可以顯示一個View
,人們經常使用Activity來保存他們應用程序的每個屏幕(而不是將其用作入口點,並將視圖控制器換入其中) )。
所以,如果你有多個活動,那麼你就需要以這樣的方式來分享它們之間的數據,也就是說你把它考慮的是兩項活動可以在任何時間作爲第一被啓動應用程序的活動。
對於這一點,你需要做的是不是「直接從另一個類設置文本視圖的文本」,但你需要修改觀察到的共享數據。
新發布的官方Android Architecture Components提供LiveData<T>
類,該類有一個名爲MutableLiveData<T>
的子類。
更新從一個類到另一個活動的數據,你必須做的是有暴露爲LiveData
public class MyApplication extends Application {
private static MyApplication INSTANCE;
DataRepository dataRepository; // this is YOUR class
@Override
public void onCreate() {
super.onCreate();
INSTANCE = this;
dataRepository = new DataRepository();
}
public static MyApplication get() {
return INSTANCE;
}
}
的DataRepository
應該公開LiveData全局數據:
public class DataRepository {
private final MutableLiveData<MyData> data = new MutableLiveData<>();
public LiveData<MyData> getMyData() {
return data;
}
public void updateText(String text) {
MyData newData = data.getValue()
.toBuilder() // immutable new copy
.setText(text)
.build();
data.setValue(newData);
}
}
凡活動同意這樣的:
public class MyActivity extends AppCompatActivity {
DataRepository dataRepository;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApplication app = (MyApplication)getApplicationContext();
dataRepository = app.getDataRepository();
setContentView(R.layout.main_activity);
textView = findViewById(R.id.textview);
dataRepository.getMyData().observe(this, new Observer() {
@Override
public void onChange(MyObject myObject) {
textView.setText(myObject.getText());
}
}
}
所以更新此文本,你需要得到DataRepository
類,並在其上調用updateText
:
DataRepository dataRepository = MyApplication.get().dataRepository();
dataRepository.updateText("my new text");
,這將正確地更新你的活動文本視圖。
我其實不想吹牛或什麼,但唯一正確的答案是我提供的:https://stackoverflow.com/questions/10996479/how-to-update-a-textview-of-an -activity-from-another-class/47637313#47637313(儘管Elye's也可以,只要他們正確地將流程中的死亡考慮在內) – EpicPandaForce