无法从其他活动设置textview文本

时间:2016-01-27 09:49:22

标签: android android-activity

我有主要活动:

public class MainActivity extends AppCompatActivity {

    Button btnadd;

    int a1 = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnadd = (Button) findViewById(R.id.btnadd);

        btnadd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final SecondAct sa = new SecondAct();

                sa.ttl(a1);


            }
        });
    }
}

我还有其他活动:

public class SecondAct extends Activity {

    public TextView txt2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        txt2 = (TextView) findViewById(R.id.txt2);
    }

    public void numsum(int no)
    { 
        txt2.setText(String.valueOf(no));
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>


    <Button
        android:id="@+id/btnadd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="addd"></Button>

    <LinearLayout
        android:layout_below="@+id/btnadd"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include layout="@layout/second"></include>
    </LinearLayout>
</RelativeLayout>

当我点击主要活动的按钮来设置第二个活动的textview文本时,它会给我错误。

错误:

FATAL EXCEPTION: main
                                                                        Process: com.example.sumdemo, PID: 13809
                                                                        java.lang.NullPointerException


                               at com.example.sumdemo.MainActivity$1.onClick(MainActivity.java:28)
                                                                        at android.view.View.performClick(View.java:4463)
                                                                        at android.view.View$PerformClick.run(View.java:18770)
                                                                        at android.os.Handler.handleCallback(Handler.java:808)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                        at android.os.Looper.loop(Looper.java:193)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5333)
                                                                        at java.lang.reflect.Method.invokeNative(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:515)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
                                                                        at dalvik.system.NativeStart.main(Native Method)

如何在不通过intent数据的情况下从主要活动设置第二个活动值?

4 个答案:

答案 0 :(得分:2)

static void Main(string[] args)
{
    CultureInfo cultureDutch = new CultureInfo("nl-NL");
    CultureInfo cultureUS = new CultureInfo("en-US");

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureDutch;
    Console.WriteLine("Input 3,3 --> Expected 3,3");
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureDutch));
    // Actual result --> 3,3

    Console.WriteLine("Input 3,3 --> Expected InvalidCastException");
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureUS));
    // Actual result --> 33

    Console.WriteLine();
    Console.WriteLine();

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureUS;
    Console.WriteLine("Input 3.3 --> Expected InvalidCastException");
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureDutch));
    // Actual result --> 33

    Console.WriteLine("Input 3.3 --> Expected 3.3");
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureUS));
    // Actual result --> 3.3
    Console.ReadLine();
}

永远不要在扩展 final SecondAct sa = new SecondAct(); sa.ttl(a1); 的类上使用new运算符。您必须使用Activity启动startActivity,并通过SecondAct对象提供其他信息

答案 1 :(得分:0)

将Application类与静态参数一起使用。

那是

class MyApp extends Application{
    public static TextView tv;
}

在第一项活动中:

usemyapp.tv = (TextView) findViewById(...);
在某个地方有权访问的人可以使用:

if (MyApp.tv != null)
    MyApp.tv.setText("a new text");

不要忘记使用处理程序将它包装在mainUiThread中。

AndroidMainfest.xml文件中的

使用此:

<application
    android:name=".MyApp" <<<<<<<<<<<<<<<<<<<<<<<this the name of the class
    >

此外,不要通过构造函数创建活动类。这是一个非常糟糕的主意:)你有这个错误,因为你已经创建了类,但onCreate()方法没有调用,也没有附加到Android UI进程。

答案 2 :(得分:0)

使用此问题作为指导。

How to manage `startActivityForResult` on Android?

并且不要尝试从其他活动更改一个活动内容。

答案 3 :(得分:0)

当您通过构造函数创建Activity对象时,您无法调用其生命周期方法(例如onCreate),因此您的活动没有View你无法访问你的观点。你必须使用startActivity让android处理创建Activity对象并调用它的生命周期方法。在膨胀视图后你应该改变它的视图。对于您的情况,您可以通过Intent传递额外数据并在第二个Activity

中使用该数据