在onCreateView(..)方法中,fragment的视图是直接通过调用LayoutInflater.inflate(..)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通常需要父视图来正确配置组件。第三个参数告诉布局生成器是否将生成的视图添加给父视图。
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View v =inflater.inflate(R.layout.fragment_crime,container,false); return v; }
在fragment中实例化组件
这里处理的是EditText组件。视图生成后,引用并为它添加对应的监听器方法
public class CrimeFragment extends Fragment { private Crime mCrime; private EditText mTitleFied; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View v =inflater.inflate(R.layout.fragment_crime,container,false); mTitleFied = (EditText)v.findViewById(R.id.crime_title); //mTitleFied.setText(mCrime.getTitle()); mTitleFied.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //This space intentionally left blank } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCrime.setTitle(s.toString()); } @Override public void afterTextChanged(Editable s) { //This one too } }); return v; }
Fragment.onCreateView(..)方法中的组件几乎等同于Activity.onCreate(Bundle)方法的处理。唯一的区别是,你调用了fragment视图的View.findViewById(int)方法,而Fragment类没有对于对应的便利方法,因此必须手动的调用。
fragment中监听器方法的设置和activity中完全一样。创建实现TextWatcher监听器接口的匿名内部类,如上面代码清代所示。TextWatcher有三个方法,不过现在只关注onTextChanged(..)方法。
在onTextChanged(..)方法中,调用CharSequence(代表用户输入)的toString()方法。该方法会最后返回用来设置Crime标题的字符串。
顺带一提的是在activity中,调用以下的方法引用已经生成的组件:
public View findViewById(int id)
该方法以组件的资源ID作为参数,返回一个视图的对象。例如,使用按钮的资源ID获取视图对象,赋值给对应的成员变量,如下面所示,注意的是,赋值前,必须现将返回的类型转化为Button。
mTrueButton = (Button)findViewById(R.id.true_button);