【问题标题】:Communicating with fragment NullPointerException [duplicate]与片段 NullPointerException 通信 [重复]
【发布时间】:2017-05-15 15:11:49
【问题描述】:

我对 Android UI 很陌生,我一直在寻找一个可以学习 UI 基本结构以及通信和布局应该如何工作的地方。但不管。我的问题来自我试图更改片段中 TextView 的值。当我尝试更改值时,我不断收到 nullPointerException。我正在使用片段管理器来引用片段。

这是片段代码:

package com.archronix.infotainment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class Fragment1 extends android.support.v4.app.Fragment {
public TextView status;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_fragment1, container, 
    false);
    return v;
}

public static Fragment1 newInstance() {
    Fragment1 f = new Fragment1();
    return f;
}

public void postText(String str){
    status.setText(status.getText()+"\n"+str);
}
}

这就是我声明我的片段管理器的方式:

fragment1 = (Fragment1) 
getSupportFragmentManager().findFragmentById(R.id.fragment1);

以及,我如何使用它:

fragment1.postText("testtext");

我的日志猫:

05-15 10:56:42.406 4109-4109/com.archronix.infotainment E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.archronix.infotainment,PID:4109 java.lang.RuntimeException:无法启动活动ComponentInfo {com.archronix.infotainment/com.archronix.infotainment.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法'void com.archronix.infotainment.Fragment1.postText( java.lang.String)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void com.archronix.infotainment.Fragment1.postText(java.lang.String)” 在 com.archronix.infotainment.MainActivity.onCreate(MainActivity.java:102) 在 android.app.Activity.performCreate(Activity.java:5933) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

为我的新手道歉。我已经阅读了 20 篇关于类似主题的堆栈溢出帖子,但似乎都已过时或不一致。完成我的任务的最佳方式是什么?谢谢。

【问题讨论】:

  • 我已阅读该帖子。而且我了解 NullPointerExceptions 是如何工作的,我的问题是我似乎无法确定我的代码中出现问题的位置和变量。
  • 您可以为此使用调试器
  • 如您所见,调试器告诉我它正在调用 from 方法。我不知道为什么会调用 NullPointerException。我希望我能很好地理解 android 方法,以便能够追踪我的问题,但遗憾的是我没有。很抱歉,如果有可用的解决方案,我不确定还要搜索什么。
  • 那不是调试器。看看这里developer.android.com/studio/debug/index.html
  • 谢谢,我会调查的。

标签: android user-interface fragment fragmentmanager


【解决方案1】:

状态变量未分配给任何文本视图。 在onCreateView中return语句前添加如下代码

status=v.findViewById(R.id.<nameoftextview>);

【讨论】:

    【解决方案2】:

    onCreateView 你应该像这样初始化你的TextView:

    status = (TextView) v.findViewById(R.id.tv_status);
    

    如果您知道要在 FragmentTransaction 之前设置的文本,则可以使用 Bundle (How to transfer some data to another Fragment?)

    【讨论】:

    • 非常感谢!虽然我可以在应用程序期间在运行时多次使用捆绑包,而不仅仅是在 onCreate 中?
    • 当屏幕方向发生变化并且您想要保存一些值(因为活动被破坏并重新创建)时,也会使用 Bundle。
    • 通常使用Bundle来将数据从Activity A传输到Activity B或Fragment之间。
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多