Java 在onCreateView外部使用findViewById返回null

Java 在onCreateView外部使用findViewById返回null,java,android,layout,oncreate,Java,Android,Layout,Oncreate,我试过几种不同的方法,但似乎不起作用。如果我使用getActivity()或getView()在onCreateView之外找到了findViewById,它将返回null,我的应用程序将崩溃 下面是一段代码片段: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Vi

我试过几种不同的方法,但似乎不起作用。如果我使用
getActivity()
getView()
onCreateView
之外找到了
findViewById
,它将返回null,我的应用程序将崩溃

下面是一段代码片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View RootView = inflater.inflate(R.layout.fragment_weather, container, false);

    addressTxt = RootView.findViewById(R.id.address);
    updated_atTxt = RootView.findViewById(R.id.updated_at);
    statusTxt = RootView.findViewById(R.id.status);
    tempTxt = RootView.findViewById(R.id.temp);
    temp_minTxt = RootView.findViewById(R.id.temp_min);
    temp_maxTxt = RootView.findViewById(R.id.temp_max);
    sunriseTxt = RootView.findViewById(R.id.sunrise);
    sunsetTxt = RootView.findViewById(R.id.sunset);
    windTxt = RootView.findViewById(R.id.wind);
    pressureTxt = RootView.findViewById(R.id.pressure);
    humidityTxt = RootView.findViewById(R.id.humidity);

    new weatherTask().execute();

    return RootView;
}

class weatherTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        getView().findViewById(R.id.loader).setVisibility(View.VISIBLE);
        getView().findViewById(R.id.mainContainer).setVisibility(View.GONE);
        getView().findViewById(R.id.errorText).setVisibility(View.GONE);

    }
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u天气,容器,错误);
addressTxt=RootView.findviewbyd(R.id.address);
updated_atTxt=RootView.findviewbyd(R.id.updated_at);
statusTxt=RootView.findviewbyd(R.id.status);
testxt=RootView.findviewbyd(R.id.temp);
temp\u minTxt=RootView.findViewById(R.id.temp\u min);
temp_maxTxt=RootView.findviewbyd(R.id.temp_max);
sunriseTxt=RootView.findviewbyd(R.id.sunrise);
sunsetTxt=RootView.findviewbyd(R.id.sunset);
windTxt=RootView.findviewbyd(R.id.wind);
pressureTxt=RootView.findViewById(R.id.pressure);
HumidityText=RootView.findViewById(R.id.湿度);
新建weatherTask().execute();
返回RootView;
}
类weatherTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
getView().findviewbyd(R.id.loader).setVisibility(View.VISIBLE);
getView().findViewById(R.id.mainContainer).setVisibility(View.GONE);
getView().findViewById(R.id.errorText).setVisibility(View.GONE);
}
}
在这里,您可以看到下面方法中的视图,
onCreateView
正在使用
getView()
,但这不起作用。我如何才能像这样在创建时在
之外使用
findViewById

TextView addressTxt, updated_atTxt, statusTxt, tempTxt, temp_minTxt,
        temp_maxTxt, sunriseTxt, sunsetTxt, windTxt, pressureTxt, humidityTxt;

//Create your views you used in AsyncTask here
//View YourView, YourContainer, ErrorText


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

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    defineViews(view);
}

private void defineViews(View view){
    addressTxt = view.findViewById(R.id.address);
    updated_atTxt = view.findViewById(R.id.updated_at);
    statusTxt = view.findViewById(R.id.status);
    tempTxt = view.findViewById(R.id.temp);
    temp_minTxt = view.findViewById(R.id.temp_min);
    temp_maxTxt = view.findViewById(R.id.temp_max);
    sunriseTxt = view.findViewById(R.id.sunrise);
    sunsetTxt = view.findViewById(R.id.sunset);
    windTxt = view.findViewById(R.id.wind);
    pressureTxt = view.findViewById(R.id.pressure);
    humidityTxt = view.findViewById(R.id.humidity);

    /*Define your views here
    YourView = view.findViewById(R.id.loader);
    YourContainer = ...
    ErrorText = ...
    ...
    */
}

class weatherTask extends AsyncTask<String, Void, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //YourView.setVisibility(View.VISIBLE);
        //YourContainer.setVisibility(View.GONE);
        //ErrorText.setVisibility(View.GONE);
    }

    @Override
    protected String doInBackground(String... strings) {
        return null;
    }
}
TextView地址文本、更新的文本、状态文本、试探文本、临时文本、,
温度maxTxt、日出TXT、日落TXT、windTxt、压力TXT、湿度TXT;
//在此处创建在AsyncTask中使用的视图
//查看您的视图、您的容器、错误文本
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u天气,容器,错误);
返回RootView;
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
定义视图(视图);
}
私有void定义视图(视图){
addressTxt=view.findviewbyd(R.id.address);
updated_atTxt=view.findviewbyd(R.id.updated_at);
statusTxt=view.findviewbyd(R.id.status);
试探文本=view.findviewbyd(R.id.temp);
temp_minTxt=view.findViewById(R.id.temp_min);
temp_maxTxt=view.findviewbyd(R.id.temp_max);
SunristTXT=view.findviewbyd(R.id.sunrise);
sunsetTxt=view.findviewbyd(R.id.sunset);
windTxt=view.findviewbyd(R.id.wind);
pressureTxt=视图findViewById(R.id.压力);
HumidityText=view.findViewById(R.id.湿度);
/*在此处定义您的视图
YourView=view.findviewbyd(R.id.loader);
您的容器=。。。
ErrorText=。。。
...
*/
}
类weatherTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//设置可见性(View.VISIBLE);
//YourContainer.setVisibility(View.GONE);
//ErrorText.setVisibility(View.GONE);
}
@凌驾
受保护的字符串背景(字符串…字符串){
返回null;
}
}

希望这能奏效。

尽量保持全局视图,并在课堂内的任何地方使用

private View mView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    mView = inflater.inflate(R.layout.fragment_weather, container, false);


    ....

    return mView;
}

class weatherTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        // Use mView here

    }
}
私有视图mView;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
mView=充气机。充气(R.layout.fragment\u天气,容器,假);
....
返回mView;
}
类weatherTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//在这里使用mView
}
}
但不建议这样做,您应该在
Activity/Fragment
中初始化视图,并将引用传递给
AsyncTask