【问题标题】:Cannot update MainActivity textview from another class无法从另一个类更新 MainActivity 文本视图
【发布时间】:2018-04-12 14:58:43
【问题描述】:

在 MainActivity 中:

 private TextView log;

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

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

 public void showMessage(final int messageType, final String msg){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
               log.setText(msg); // here is the problem
            }
         }
 });

在日志类中:

 private static MainActivity mainActivity;

 public logClass() {
    mainActivity = new MainActivity();
 }

 public void log() {
    try {
        mainActivity.showMessage(MessageTag.TIP, "Connecting...");
    } catch(Exception el) {
        el.printStackTrace();
    }
 }

在调用片段中:

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        logClass.log();

                    }
                }).start();
        }
    }

但我遇到了这个问题:

FATAL EXCEPTION: main
              Process: com.test.testing, PID: 7636
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                  at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117)
                  at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
                  at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29)
                  at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54)
                  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:202)
                  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
                  at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
                  at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
                  at com.test.testing.MainActivity$2.run(MainActivity.java:97)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)

【问题讨论】:

  • 看起来您的 log 为空。这可能是因为您在 activity_main.xml 中没有名为 TextView 的 log 或者您在 MainActivity 中的 oncreate 方法尚未调用。如果您已将 MainActivity 实例从 MainActivity 本身传递给您的 Another 类,那么您可以忽略第二种可能性。
  • 我更新了这个问题。我想我是从另一个片段中调用它的。
  • 如果你愿意,你可以将你的 TextView 设为公开。您可以从其他活动中调用它,例如 MainActivity.textview.settext("");
  • 还提供完整的堆栈跟踪。
  • 你不能这样调用'mainActivity = new MainActivity();' .您必须从“MainActivity”本身获取此实例。像这样来自 MainActivity , new LogClass(this);其中thisMainActivity 的实例。简而言之,除非您有绝对的理由这样做,否则永远不要自己创建 Activity 类的实例,这是我从未有过的感觉。

标签: android android-thread


【解决方案1】:

我认为您不能从另一个活动中编辑另一个活动中的内容。

edit array from another activity

如果可能,此答案会详细说明如何完成。

【讨论】:

  • 这里的Another类不一定是Activity。使用服务类的回调来更新 UI 并不少见。
  • 我更新了这个问题。我想我是从另一个片段中调用它的。
【解决方案2】:

如果callFragmentMainActivity 上膨胀,那么您可以简单地执行此操作。

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                ((MainActivity) getActivity()).showMessage(MessageTag.TIP, "Connecting...");
        }
    }

我也没有在您的代码中发现使用 Thread。因为如果android默认在主线程上运行,这可以改变你的观点。因此,您可以删除多余的包装在线程中的代码。

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 2020-09-04
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多