Java Android按钮返回为空

Java Android按钮返回为空,java,android,Java,Android,我有一个包含多个片段的项目,我使用底部导航在它们之间切换。在我的最后一个片段中,我尝试使用一个按钮,根据上一个片段的输入更改其文本。我使用一个bundle来传输数据,这很好,但是当我试图将按钮的文本设置为传输的输入时,我得到了一个空指针。我已经调试并发现,无论出于什么原因,Android Studio都会将按钮设置为null,即使有正确的声明。我对Android还是相当陌生的,所以任何帮助都将不胜感激 public class Result extends Fragment { private

我有一个包含多个片段的项目,我使用底部导航在它们之间切换。在我的最后一个片段中,我尝试使用一个按钮,根据上一个片段的输入更改其文本。我使用一个bundle来传输数据,这很好,但是当我试图将按钮的文本设置为传输的输入时,我得到了一个空指针。我已经调试并发现,无论出于什么原因,Android Studio都会将按钮设置为null,即使有正确的声明。我对Android还是相当陌生的,所以任何帮助都将不胜感激

public class Result extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";


private String mParam1;
private String mParam2;
private Button drugButton;

private OnFragmentInteractionListener mListener;

public Result() {
    // Required empty public constructor
}

public static Result newInstance(String param1, String param2) {
    Result fragment = new Result();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

}

public View onCreateView(LayoutInflater inflater, ViewGroup fragment_container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view2 = inflater.inflate(R.layout.fragment_search,fragment_container,false);
    Bundle args = getArguments();
    drugButton = (Button) view2.findViewById(R.id.drugButt);
    System.out.println(drugButton);
    if(args != null)
    {
        String drug = args.getString("resultKey");
        drugButton.setText(drug);
    }

    return inflater.inflate(R.layout.fragment_result, fragment_container, false);
}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

public void onDetach() {
    super.onDetach();
    mListener = null;
}

public interface OnFragmentInteractionListener {
    void onFragmentInteraction(Uri uri);
}
}
这是我的错误信息

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.alurk.marnpp, PID: 8735
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setText(java.lang.CharSequence)' on a null object reference
    at com.example.alurk.marnpp.Result$override.onCreateView(Result.java:57)
    at com.example.alurk.marnpp.Result$override.access$dispatch(Unknown Source:116)
    at com.example.alurk.marnpp.Result.onCreateView(Unknown Source:21)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6710)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

这是因为您在onCreateView中返回的是不同的视图,如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup fragment_container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view2 = inflater.inflate(R.layout.fragment_search,fragment_container,false);
    Bundle args = getArguments();
    drugButton = (Button) view2.findViewById(R.id.drugButt);
    System.out.println(drugButton);
    if(args != null)
    {
        String drug = args.getString("resultKey");
        drugButton.setText(drug);
    }

    return inflater.inflate(R.layout.fragment_result, fragment_container, false);
}
你应该这样做:

public View onCreateView(LayoutInflater inflater, ViewGroup fragment_container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view2 = inflater.inflate(R.layout.fragment_search,fragment_container,false);


        ...

        return view2;

}
发生此错误是因为您正在将onCreateView中的按钮与以下位置的视图绑定:

View view2 = inflater.inflate(R.layout.fragment_search,fragment_container,false);
但在方法的最后,您给出了不同的观点:

return inflater.inflate(R.layout.fragment_result, fragment_container, false);
改变

    return inflater.inflate(R.layout.fragment_result, fragment_container, false);


我认为这是因为你没有返回错误的布局,你膨胀了其他布局而不是返回

欢迎使用StackOverflow

首先,决定要充气的布局:

R.layout.fragment\u搜索或R.layout.fragment\u结果

后者似乎很明显

接下来,使用onViewCreated覆盖它。此方法带来onCreateView中膨胀的视图。因此,您的代码看起来比您当前的代码清晰得多:

// best place to fetch arguments passed
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

// best place to inflate layout that you want to be displayed in Fragment
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflate(R.layout.fragment_result,fragment_container,false);
}

// best place to use the View that was inflated in onCreateView()
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    drugButton = (Button) view.findViewById(R.id.drugButt);
}

当我使用return view2时,它会显示第二个片段的副本,当我有当前的return语句时,它会正确显示片段。这意味着正确的布局是第二个,即片段\结果布局。@ALurkingBear您的按钮存在于哪个布局中?fragment\u result或fragment\u search?因此,更改视图2=inflater.inflater.layout.fragment\u search,fragment\u container,false;查看view2=充气机.充气机.布局.碎片结果,碎片容器,false;啊,我知道发生了什么。当我创建fragment_结果时,它不包括充气线。我从片段搜索中复制了这一行,但忘了交换代码。现在一切正常。非常感谢你!
// best place to fetch arguments passed
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

// best place to inflate layout that you want to be displayed in Fragment
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflate(R.layout.fragment_result,fragment_container,false);
}

// best place to use the View that was inflated in onCreateView()
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    drugButton = (Button) view.findViewById(R.id.drugButt);
}