Android 如何将文本设置为其他活动中的文本视图
因此,我试图使之发生的是,当您选中此复选框a时,一些文本将出现在用户稍后将访问的不同活动中的不同文本视图中。该应用程序有点像一个测验应用程序,所以这段文字会像最终分数或其他东西一样不受欢迎 起初,我试着这样做:Android 如何将文本设置为其他活动中的文本视图,android,Android,因此,我试图使之发生的是,当您选中此复选框a时,一些文本将出现在用户稍后将访问的不同活动中的不同文本视图中。该应用程序有点像一个测验应用程序,所以这段文字会像最终分数或其他东西一样不受欢迎 起初,我试着这样做: if (checkBoxA.isChecked()){ systemView.setText("Business"); } 但是我得到了一个nullPointerException,因为“systemView”不在同一个活动中。该活动将扩展到“系统视图”所在的
if (checkBoxA.isChecked()){
systemView.setText("Business");
}
但是我得到了一个nullPointerException,因为“systemView”不在同一个活动中。该活动将扩展到“系统视图”所在的其他活动。所以我真的不确定出了什么问题,有人知道我应该怎么做吗?你可以在活动之间传递你的文本。。否则,如果要保存文本以便以后恢复,即使关闭并重新启动应用程序,也可以将其保存在共享首选项文件中,以便在以后显示时从该文件中检索。。但是,您不能将文本设置为不在前台的活动的文本视图。根据具体的使用情况,有许多方法可以做到这一点,其中一种可能比其他方法更适合 如果要打开第二个活动,则可以将数据打包并通过intent传递给其他活动 或者您可以存储这些值(在共享的prefs或sqlite中),然后在下一个活动中检索它们
您可以使用RxJava通过主题(本例中最有可能是bevahior主题)创建流,并在第一个活动中写入流,然后在下一个活动中订阅流以获取值。如果使用意图转到下一个活动,则可以将该值放入字符串中,并将该字符串作为额外的字符串传递给意图。在下一个活动中获取值并设置文本视图
//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"));
}
您的问题是,即使您可以通过使用
R.ID.systemView
获取系统视图的,当您尝试使用findViewById(R.ID.systemView)
查找该视图时,该视图无法找到,因为它不在当前活动的视图组列表中。因此,返回null
- 请注意systemView,因为已假定给定给TextView的id
也就是说,您只能成功地使用findViewById
在当前视图组中查找视图(例如,对于this.FindyViewById
setContentView设置的布局)
相反,您需要使该值对其他活动可用,然后在其他活动中检索该值
有多种方法可以使值可用,一些选项包括:-
要通过启动另一个活动的Intent将其作为Intent extra传递给该活动,可以将该值存储在共享首选项中,然后在另一个活动中检索该值,也可以将该值存储在数据库中,例如SQLite并检索该值
如果您直接以有限的值启动其他活动,则使用IntentExtra是理想的选择
- 使用链接的意图附加也是可行的(即传递到一个活动,然后传递到另一个活动,依此类推)
共享首选项可能适合以下情况:要传递的值数量有限,而另一个活动不是直接从该活动启动的
数据库将适合存在大量结构化数据和/或相关数据的情况(或者如果您将数据库用于其他方面)
使用意图的示例可以是:-
在传递值的活动中
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);
- 您可以设置pass和return multiple IntentExtras,请参阅可传递/检索的各种选项和值类型
简单的工作示例
下面是一个工作示例的代码。第一个活动(MainActivity)有一个复选框和一个按钮
该按钮可以单击或长单击。如果是后者,则不会向第二个活动传递任何内容。如果是前者,则取决于复选框是否勾选,将通过“未勾选”或“业务”
第二个活动,如果传递了值(“未检查”或“业务”),将显示传递的值,如果未传递任何内容,则将显示“未传递任何内容”。第二个活动上的按钮将返回到第一个活动(或者使用后退按钮将返回到第一个活动)
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);
}
}
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();
}
}
活动\u 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>
<?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>
活动\u 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=".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>
<?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>
只需使用SharedReferences
保存TextView
值,然后当转到包含TextView
的活动时,获取保存的值,并将其设置为onCreate
方法中的TextView
,这不是我在回答你的问题,而是。。。你为什么不把答案保存在一个文件里,以后再看那个文件呢?谢谢,我用一个复选框和按钮就试过了,它成功了。但是,当我添加更多复选框时,无论我选中哪个复选框,TextView都只会显示相同的文本。我设置了不同的字符串和文本或每个字符串和文本,因此我不确定问题出在哪里。@Mira您应该添加另一个问题,并包括代码,特别是有关处理复选框的逻辑。我确实设置了,请检查一下