如何在不同的活动中将Text设置为TextView



所以我想做的是,当你选中这个复选框a时,一些文本会出现在用户稍后访问的不同活动中的不同TextView中。该应用程序有点像问答应用程序,所以它不会像最终分数或其他东西一样显示文本。

起初我尝试了这个:

if (checkBoxA.isChecked()){
systemView.setText("Business");
}

但后来我得到了一个nullPointerException,因为"systemView"不在同一个活动中。该活动将扩展到"systemView"所在的其他活动。所以我真的不确定出了什么问题,有人知道我该怎么办吗?

您的问题是,即使您可以使用R.id.systemView获得systemViewTextView的ID,但当您尝试使用findViewById(R.id.systemView)查找该视图时,由于该视图不在当前活动的ViewGroup列表中,因此无法找到该视图。因此,返回CCD_ 4。

  • 注意systemView,因为已经假定了给TextView的id

也就是说,您只能成功使用findViewById在当前ViewGroup中查找视图(例如,对于this.FindyViewById,布局由setContentView设置)。

相反,您需要使该值可用于其他活动,然后在其他活动中检索该值。

有各种方法可以使价值可用,一些选项是:-

要通过Intent将其传递给活动,该Intent将启动另一个活动作为Intent extra,您可以将该值存储在共享的首选项中,然后在另一活动中检索它,也可以将值存储在数据库中,例如SQLite中并检索它。

如果您使用有限数量的值直接启动另一个活动,那么使用IntentExtra是理想的选择。

  • 使用链式Intent Extras也是可行的(即传递到一个活动,然后传递到另一个活动等等)

共享首选项可以适用于要传递的值数量有限且其他活动不是直接从该活动启动的情况。

数据库适用于存在大量结构化数据和/或相关数据的情况(或者如果您正在将数据库用于其他方面)。

使用Intent的示例可以是:-

在传递值的活动中

Intent i = new Intent(this, yourOtherActivity.class);
i.putExtra("YOURINTENTEXTRAKEY","Business"); //<<<< 1st parameter is a Key for identification, the 2nd parameter is the value to be passed
startActivity(i);

在其他"活动"的onCreate中(设置contentView之后)

TextView mSystemView = this.find(R.id.systemView);
if (this.getIntent().getStringExtra("YOURINTENTEXTRAKEY") != null) {
mSystemView.setText(this.getItent().getStringExtra("YOURINTENTEXTRAKEY"));
} else {
mSystemView.setText("NO VALUE PASSED");
}
  • 您设置了传递和返回多个IntentExtras。有关可以传递/检索的各种选项和值类型,请参阅Intent

简单工作示例

以下是一个工作示例的代码。第一个活动(MainActivity)具有复选框按钮

按钮可以单击或长时间单击。如果是后者,则不向第二个活动传递任何内容。如果前者则取决于复选框是否被勾选;未选中";或";商务";。

第二个活动,如果传递了一个值("Not Checked"或"Business"),将显示传递的值,如果没有传递任何值,则显示"No Checked";什么都没有通过";。第二个活动上的按钮将返回到第一个活动(交替使用后退按钮将返回第一个活动)。

MainActivity.java

public class MainActivity extends AppCompatActivity {
public static final String INTENTKEY_CHECKBOXA = "checkboxa";
CheckBox checkBoxA;
Button nextActivity;
String valueToPass = "Not Checked";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkBoxA = this.findViewById(R.id.checkBoxA);
checkBoxA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (checkBoxA.isChecked()) {
valueToPass = "Business";
} else {
valueToPass = "Not Checked";
}
}
});
nextActivity = this.findViewById(R.id.nextActivity);
//Set onlick listener (pass value via intent)
nextActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callNextActivity(true);
}
});
// Set onlongclick listener (doesn't pass value via intent)
nextActivity.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
callNextActivity(false);
return true;
}
});
}
private void callNextActivity(boolean passvalue) {
Intent i = new Intent(this,NextActivity.class);
if (passvalue) {
i.putExtra(INTENTKEY_CHECKBOXA, valueToPass);
}
startActivity(i);
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:id="@+id/nextActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NEXT ACTIVITY"/>
<CheckBox
android:id="@+id/checkBoxA"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

NextActivity.java

public class NextActivity extends AppCompatActivity {
Button doneButton;
TextView systemView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
systemView = this.findViewById(R.id.sysstemView);
doneButton = this.findViewById(R.id.done);
if (this.getIntent().getStringExtra(MainActivity.INTENTKEY_CHECKBOXA) != null) {
systemView.setText(this.getIntent().getStringExtra(MainActivity.INTENTKEY_CHECKBOXA));
} else {
systemView.setText("NOTHING PASSED");
}
doneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
doneWithActivity();
}
});
}
// Return from this activity
private void doneWithActivity() {
this.finish();
}
}

activity_next.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NextActivity">
<Button
android:id="@+id/done"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DONE"/>
<TextView
android:id="@+id/sysstemView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

您可以在活动之间传递导航意图中的文本。。否则,如果您希望保存文本以便以后恢复,即使关闭并重新启动应用程序,也可以将其保存在共享首选项文件中,以便在以后显示时从该文件中检索。。但不能将文本设置为不在前台的活动的文本视图。

根据您的具体用例,有很多方法可以做到这一点,其中一种可能比其他方法更适合。

如果您正在打开第二个活动,您可以将数据包装在一个捆绑包中,并通过意向将其传递给您的其他活动

或者,您可以存储值(在共享prefs或sqlite中),然后在下一个活动中检索它们。

您可以使用RxJava通过主题创建流(在这种情况下很可能是bevahior主题),并在第一个活动中写入流,然后在下一个活动中订阅流以获取值。

如果您使用intent进入下一个活动,您可以将该值放入字符串中,并将该字符串作为附加值传递给intent。取下一个活动中的值并设置文本视图。

//First Activty
String valueToPass = "";
if (checkBoxA.isChecked()){
valueToPass = "Business";
}
startActivity(new Intent(CurrentActivity.this, NextActivity.class).putExtra("value", valueToPass));

//Second Activity
if(getIntent().getString("value") != null)){
systemView.setText(getIntent().getString("value"));
}

只需使用SharedPreferences保存TextView值,然后当转到包含TextViewActivity时,获取保存的值,并在onCreate方法中将其设置为TextView

最新更新