Использование findViewById снаружи onCreateView возвращает нуль - PullRequest
0 голосов
/ 08 января 2020

Я пробовал пару разных методов, но, похоже, это не работает. Если я сделаю findViewById вне onCreateView с getActivity() или getView(), он вернет ноль, и мое приложение вылетит.

Вот фрагмент кода:

@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);

    }
}

Здесь Вы можете видеть представления в методе ниже, onCreateView использует getView(), но это не работает. Как мне go иметь возможность использовать findViewById вне onCreate, как это?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Старайтесь, чтобы ваше представление было глобальным, и используйте его где-нибудь внутри класса

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

    }
}

Но это не рекомендуется, вам следует инициализировать представление внутри Activity/Fragment и передать ссылку на AsyncTask

0 голосов
/ 08 января 2020

Попробуйте;

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;
    }
}

надеюсь, что это сработает.

...