所以我想做的是,当您选中此checkBoxA时,某些文本将出现在用户以后将到达的不同Activity中的不同TextView中。该应用程序有点像测验应用程序,因此可以像最终成绩或其他内容一样处理文本。
起初我尝试了这个:
if (checkBoxA.isChecked()){
systemView.setText("Business");
}
但是随后我得到了nullPointerException,原因是“ systemView”不在同一活动中。该活动扩展到“ systemView”所在的其他活动。因此,我不确定是谁出了问题该怎么办?
答案 0 :(得分:1)
只需使用SharedPreferences
保存TextView
值,然后在包含Activity
的{{1}}时获取保存的值并将其设置为{{1 }}中的TextView
答案 1 :(得分:0)
您可以在活动之间的导航中传递文本..否则,如果您要保存文本以便以后恢复,即使关闭并重新启动应用程序,也可以将其保存在共享的首选项文件中,以便以后要显示时从此文件中检索它。.但是不能将文本设置为不在前台的活动的文本视图。
答案 2 :(得分:0)
有许多方法可以做到这一点,具体取决于您的实际用例,其中一种可能比其他用例更适合。
如果您要打开第二个活动,则可以将数据打包成一个包并将其通过意图传递给其他活动
或者您可以将值存储在共享的prefs或sqlite中,然后在下一个活动中检索它们。
您可以使用RxJava通过主题(在这种情况下,很可能是主题主题)创建流,并在第一个活动中写入该流,然后在下一个活动中订阅该流以获取值。
答案 3 :(得分:0)
如果您使用意图进行下一个活动,则可以将值放在字符串中,并将字符串作为额外内容传递给意图。在下一个活动中获取值并设置文本视图。
//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"));
}
答案 4 :(得分:0)
您的问题是,即使您可以使用 ID
获得 systemView TextView的 R.id.systemView
当您尝试使用findViewById(R.id.systemView)
查找该视图时,找不到该视图,因为该视图不在当前活动的ViewGroup列表中。这样就返回了null
。
也就是说,您只能成功使用findViewById
在当前ViewGroup中查找视图(例如,对于this.FindyViewById
由setContentView设置的布局)。
相反,您需要使该值可用于其他活动,然后在其他活动中检索该值。
有多种方法可以使值可用,其中一些选项是:-
要通过启动另一个活动的Intent将其传递给活动,您可以将值存储在共享首选项中,然后在其他活动中检索它,也可以将值存储在数据库中,例如SQLite并检索它。
如果直接使用数量有限的值启动其他活动,则使用IntentExtra是理想的选择。
共享的首选项可能适合要传递的值数量有限且其他活动不是直接从该活动开始的情况。
数据库将适合存在大量结构化数据和/或相关数据的情况(或者如果您将数据库用于其他方面)。
在传递值的Activity中
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");
}
以下是一个工作示例的代码。第一个活动(MainActivity)具有一个复选框和一个按钮。
可以单击或长按按钮。如果是后者,则没有任何内容传递给第二个活动。如果前者然后考虑是否勾选了CheckBox,则将通过“ Not Checked”或“ Business”。
第二个活动,如果传递了一个值(“未检查”或“业务”)将显示传递的值,如果未传递任何内容,则将显示“没有通过”。第二个活动上的按钮将返回第一个活动(或者使用后退按钮将返回第一个活动)。
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>