【问题标题】:Sending data from Activity to Fragment: NPE [duplicate]将数据从活动发送到片段:NPE [重复]
【发布时间】:2019-06-27 12:54:46
【问题描述】:

我正在尝试将计算结果从我的 Activity 发送到 Fragment。
我搜索了如何做到这一点,我正在尝试使用 Bundle。 How to pass values between Fragments
我经常遇到 NPE 问题,但那时我可以自己解决它们这个具体案例。
我是编码新手,很抱歉给您带来不便,如果我忘记了任何代码,我也很抱歉,但我认为这两个类就足够了。
错误:

'java.lang.String android.os.Bundle.getString(java.lang.String)' 在空对象引用上

这是我的 Bundle 的类。
KalorienZaehlerRechner.java: (FragmentActivity)

public class KalorienzaehlerRechner extends FragmentActivity {

Button btn;
EditText userProteine;
EditText userKH;
EditText userKHz;
EditText userFett;
EditText userGegG;

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

    userProteine = findViewById(R.id.userGegPRechner);
    userKH = findViewById(R.id.userGegKHRechner);
    userKHz = findViewById(R.id.userGegKHzRechner);
    userFett = findViewById(R.id.userGegFRechner);
    userGegG = findViewById(R.id.userGegG);

    btn = findViewById(R.id.btnhin);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            gerichthinzufuegen();
        }
    });
}

public void gerichthinzufuegen(){

    int usG = Integer.parseInt(userGegG.getText().toString());
    int usKH = Integer.parseInt(userKH.getText().toString());
    int usKHz = Integer.parseInt(userKHz.getText().toString());
    int usP = Integer.parseInt(userProteine.getText().toString());
    int usF = Integer.parseInt(userFett.getText().toString());

    int USg = usG/100;

    float resultP = (usP * USg) * 4.1f;
    float resultF = (usF * USg) * 9.1f;
    float resultKH = (usKH * USg) * 4.1f;

    float userKcal = resultP + resultF + resultKH;
    int intUserKcal = Math.round(userKcal);



    Bundle bundle = new Bundle();
    bundle.putInt("data", intUserKcal);
    Fragment fragmentobject = new Fragment();
    fragmentobject.setArguments(bundle);

    }
}

这是我的片段。我想在此处接收结果以将其显示在 TextView 中。
Kalorienzähler.java:

public class KalorienzählerFragment extends Fragment {
Button neuesGericht;
TextView uKcal;

@Override
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View kalorienZaehler = inflater.inflate(R.layout.fragment_kalorienzaehler, container, false);

    uKcal = kalorienZaehler.findViewById(R.id.userGegKcal);
    neuesGericht = kalorienZaehler.findViewById(R.id.btnGericht);
    String userKcal = getArguments().getString("data");
    uKcal.setText(userKcal);

    neuesGericht.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openZaehlerRechner();

        }
    });

    return kalorienZaehler;
}

public void openZaehlerRechner(){
    Intent ZaehlerRechner = new Intent(getActivity(), KalorienzaehlerRechner.class);
    startActivity(ZaehlerRechner);
    }
}

感谢所有愿意提供帮助的人!

【问题讨论】:

  • 由于给定代码中没有FragmentTransaction,我假设您的布局中有<fragment> 元素用于KalorienzählerFragment。如果是这种情况,您不能将参数传递给该 Fragment 实例。 <fragment> 元素使Activity 实例化并在setContentView() 调用中自动添加Fragment。您将永远没有机会在该实例上设置参数。如果您必须将参数传递给KalorienzählerFragment,那么您必须将<fragment> 更改为<FrameLayout>,并在代码中自己处理加载Fragment

标签: java android android-activity nullpointerexception


【解决方案1】:

在您的班级“KalorienzählerFragment”中,您需要编辑这些行:

String userKcal = getArguments().getString("data");
uKcal.setText(userKcal);

对这些:

Bundle arguments = getArguments();
if (arguments != null) {
    uKcal.setText(arguments.getString("data", "<SomeDefaultValueIfYouWant>"));
}

您的问题是,当调用 getString() 时,Bundle 为空,这会导致 NPE。

编辑:请注意,这并不能解决根本问题。这只会阻止 NPE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2017-02-06
    • 2020-03-29
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多