Android 在片段中查找未放入onCreateView的ViewById
我想知道是否可以在onCreateView方法之外设置我的TextView 下面是在Android studio上成功运行的代码Android 在片段中查找未放入onCreateView的ViewById,android,fragment,Android,Fragment,我想知道是否可以在onCreateView方法之外设置我的TextView 下面是在Android studio上成功运行的代码 public class TabMatchFragmentOdd extends Fragment { TextView Home, Away; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstan
public class TabMatchFragmentOdd extends Fragment {
TextView Home, Away;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.tab_match_odd, container, false);
Home = (TextView) v.findViewById(R.id.homename);
Away = (TextView) v.findViewById(R.id.awayname);
getIncomingIntent();
return v;
}
private void getIncomingIntent() {
if (getActivity().getIntent().hasExtra("HomeName") && getActivity().getIntent().hasExtra("AwayName")) {
String HomeName = getActivity().getIntent().getStringExtra("HomeName").toString();
String AwayName = getActivity().getIntent().getStringExtra("AwayName").toString();
setContent(HomeName,AwayName);
} else {
Toast.makeText(getActivity(), "No", Toast.LENGTH_SHORT).show();
}
}
private void setContent(String home, String away) {
Home.setText(home);
Away.setText(away);
}
}
但我想通过具体的方法使我的代码更加清晰
我可以用上面类似的方法吗
public class TabMatchFragmentOdd extends Fragment {
TextView Home, Away;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
getIncomingIntent();
return v;
}
private void getIncomingIntent() {
if(getActivity().getIntent().hasExtra("HomeName")&&getActivity().getIntent().hasExtra("AwayName")) {
String HomeName = getActivity().getIntent().getStringExtra("HomeName").toString();
String AwayName = getActivity().getIntent().getStringExtra("AwayName").toString();
setContent(HomeName,AwayName);
}else{
Toast.makeText(getActivity(), "No:", Toast.LENGTH_SHORT).show();
}
}
private void setContent(String home, String away) {
Home = (TextView) getActivity().findViewById(R.id.homename);
Away = (TextView) getActivity().findViewById(R.id.awayname);
Home.setText(home);
Away.setText(away);
}
}
运行应用程序后,它会给我一个NullPointException
无论我使用getActivity还是getView,它都不起作用
这背后的概念是什么?片段的布局与活动的布局无关,因此getActivity.findViewById将失败
在展开布局后的onCreateView中,执行以下操作:
Home = (TextView) v.findViewById(R.id.homename);
一些编码风格提示:将TextView的访问设置为私有。命名它们时,以小写字母开头,并在结尾附加Tv,这样您就知道这个私有字段是一个TextView片段的布局与活动的布局无关,因此getActivity.findViewById将失败
在展开布局后的onCreateView中,执行以下操作:
Home = (TextView) v.findViewById(R.id.homename);
一些编码风格提示:将TextView的访问设置为私有。命名它们时,以小写字母开头,并在末尾附加Tv,以便您知道此专用字段是文本视图首先关于膨胀视图:
此代码如下:
View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
膨胀视图,这意味着它接受xml文件并只创建所有这些对象。因此,在此之后,v是一个视图,它包含xml中定义的所有其他视图。这就是为什么您可以使用:
(TextView) v.findViewById(R.id.awayname);
因为这个文本视图是definec内部视图
getView和getActivity的区别
另一件事是,您的片段由活动托管。它还通过使用setContentView使其视图膨胀。。。方法通过此操作,您可以使用Activity.findViewById,并且您将能够在setContentView中的Activity的xml文件集中找到膨胀的视图。
这就是为什么:
(TextView) v.findViewById(R.id.awayname);
工作,以及
(TextView) getActivity().findViewById(R.id.awayname);
没有。Activity只是没有扩展包含R.id.awayname的视图。
如您所见:getActivity只返回承载片段的活动,而getView返回从onCreateView方法返回的视图
为什么getView生成null
这是因为在onCreateView返回语句之前使用了getView方法
怎么办
要使其工作,明智的做法是在片段/活动内部创建如下属性:
公共类TabMatchFragmentOdd扩展了片段{
TextView Home,Away
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
getViews(v);
return v;
}
private void getIncomingIntent() {
(...)
setContent(HomeName,AwayName);
}
private void getViews(View v) {
Home = (TextView) v.findViewById(R.id.homename);
Away = (TextView) v.findViewById(R.id.awayname);
}
private void setContent(String home, String away) {
Home.setText(home);
Away.setText(away);
}
首先,关于膨胀视图:
此代码如下:
View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
膨胀视图,这意味着它接受xml文件并只创建所有这些对象。因此,v之后是一个包含xml中定义的所有其他视图的视图。这就是为什么可以使用:
(TextView) v.findViewById(R.id.awayname);
因为这个文本视图是definec内部视图
getView和getActivity的区别
另一件事是,您的片段由Activity托管。它的视图也通过使用setContentView…方法膨胀。通过使用Activity.findViewById,您将能够在setContentView中的Activity的xml文件集中找到膨胀的视图。
这就是为什么:
(TextView) v.findViewById(R.id.awayname);
工作,以及
(TextView) getActivity().findViewById(R.id.awayname);
没有。活动只是没有膨胀包含R.id.awayname的视图。
如您所见:getActivity只返回承载片段的活动,而getView返回从onCreateView方法返回的视图
为什么getView生成null
这是因为在onCreateView返回语句之前使用了getView方法
怎么办
要使其工作,明智的做法是在片段/活动内部创建如下属性:
公共类TabMatchFragmentOdd扩展了片段{
TextView Home,Away
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v;
v = inflater.inflate(R.layout.tab_match_odd, container, false);
getViews(v);
return v;
}
private void getIncomingIntent() {
(...)
setContent(HomeName,AwayName);
}
private void getViews(View v) {
Home = (TextView) v.findViewById(R.id.homename);
Away = (TextView) v.findViewById(R.id.awayname);
}
private void setContent(String home, String away) {
Home.setText(home);
Away.setText(away);
}
运行应用程序后,它出现了nullpointexception错误
无论我使用getActivity还是getView,它都不起作用
这背后的概念是什么
调用getView时,将得到以下结果:
如果onCreateView尚未完成,则getView返回null
如果onCreateView已完成,则getView将返回在onCreateView中返回的内容
在代码中,setContent由getIncomingIntent调用,onCreateView调用它。这意味着onCreateView尚未完成,因此getView此时将始终返回null
您可以对第二段代码进行的最小更改是将getIncomingIntent调用从onCreateView移到onViewCreated:
运行应用程序后,它出现了nullpointexception错误
无论我使用getActivity还是getView,它都不起作用
这背后的概念是什么
调用getView时,将得到以下结果:
如果onCreateView尚未完成,则getView返回null
如果onCreateView已完成,则getView将返回在onCreateView中返回的内容
在代码中,setContent由getIncomingIntent调用,onCreateView调用它。这意味着onCreateView尚未完成,因此getView此时将始终返回null
对第二个代码段所做的最小更改
代码的作用是将getIncomingIntent调用从onCreateView移到onViewCreated:
非常感谢你的解释,我明白了!非常感谢你的解释,我明白了!谢谢你,Rene,现在我知道了片段和活动之间的区别,你的编码技巧真的很有用,欢迎你!当然还有更多的事情要做;想象一下,当膨胀布局时,返回的视图是根元素,findViewById得到的所有视图都在它下面。注意,我这样描述它,所以你可以更好地想象它。不管怎样,如果你还有什么问题,尽管问吧!再次感谢你花了这么多时间:现在我知道了谢谢你,Rene,现在我知道了片段和活动之间的区别,你的编码技巧真的很有用,欢迎你!当然还有更多的事情要做;想象一下,当膨胀布局时,返回的视图是根元素,findViewById得到的所有视图都在它下面。注意,我这样描述它,所以你可以更好地想象它。不管怎样,如果你还有什么问题,尽管问吧!再次感谢您花费这么多时间:现在我收到了Hanks Ben,我从您的OnViewCreated方法中学到了一些新东西,谢谢Ben,我从您的OnViewCreated方法中学到了一些新东西,