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