Android 如何将文本设置为其他活动中的文本视图

Android 如何将文本设置为其他活动中的文本视图,android,Android,因此,我试图使之发生的是,当您选中此复选框a时,一些文本将出现在用户稍后将访问的不同活动中的不同文本视图中。该应用程序有点像一个测验应用程序,所以这段文字会像最终分数或其他东西一样不受欢迎 起初,我试着这样做: if (checkBoxA.isChecked()){ systemView.setText("Business"); } 但是我得到了一个nullPointerException,因为“systemView”不在同一个活动中。该活动将扩展到“系统视图”所在的

因此,我试图使之发生的是,当您选中此复选框a时,一些文本将出现在用户稍后将访问的不同活动中的不同文本视图中。该应用程序有点像一个测验应用程序,所以这段文字会像最终分数或其他东西一样不受欢迎

起初,我试着这样做:

 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您应该添加另一个问题,并包括代码,特别是有关处理复选框的逻辑。我确实设置了,请检查一下