弓背霞明剑照霜,秋风走马出咸阳。这篇文章主要讲述Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决相关的知识,希望能为你提供帮助。
程序很easy。好长时间没有搞定。郁闷。。。。
。
。。。。
。
。
。
在论坛咨询,最终找到答案。
描写叙述:
一个Activity:MainActivity。内部是一个Fragment:FragmentA。FragmentA里面有TextView。
问题:不管怎样也得不到FragmentA内部的TextView,返回值永远是Null
详细描写叙述:
MainActivity的layout:activity_main.xml
< ?xml version="1.0" encoding="utf-8"?
> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> < fragment android:name="com.fragmentexercise.FragmentA" android:id="@+id/fragment_a" android:layout_width="match_parent" android:layout_height="match_parent" /> < /LinearLayout>
FragmentA的layout:fragment_a.xml
< ?
xml version="1.0" encoding="utf-8"?> < TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:textSize="18sp" android:text="初始化文本" />
MainActivity.java【Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决】
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
FragmentA.java
public class FragmentA extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_a, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //TextView textView1 = (TextView) getView().findViewById(R.id.textView1); //textView1.setText("改变"); }
详细问题:
在FragmentA.onActivityCreated()中。
TextView textView1 = (TextView) getView().findViewById(R.id.textView1); 得到的始终是Null。
在Fragment.onCreateView()中,
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 第二个參数 container一直是个空值
在MainActivity中,findViewById(R.id.textView1), 相同是空值。
问题在哪里呢??????????
===============================================================================================================
原因
让Activity 继承 android.support.v4.app.FragmentActivity, 让Fragment继承android.support.v4.app.Fragment就能够了
这样。在FragmentA的onStart等方法中,getActivity().findViewById(R.id.textView1) 就能得到这个TextView。
直接继承 android.app.Fragment,就不行。或许是Android的bug吧。
事实上我是依照developer.android.com上的trainning的样例做的。那个样例是为了兼容android3.0曾经的系统,继承了android.support.v4.app.Fragment。官方样例执行正常。
我的手机是Android4.1的,能够支持Fragment。所以我直接继承了adnroid.app.Fragment。结果就死活不成功。
想不到是这个原因。
推荐阅读
- 64位pe打开盘自制办法
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
- Android中关于JNI 的学习(零)简单的样例,简单地入门
- Android Studio第四十期 - 上传头像功能支持权限管理
- Android 获取屏幕截图 和保存到本地的sd卡路径下
- UVALive 6084Happy Camper(数学题)
- idea 新建 maven 项目 (避免 idea 在使用 maven 新建 webapp 骨架项目时一直 downloading 的问题)
- 关于Android attrs 自定义属性的说明
- [转][Dapper]SQL 经验集