本文源自《android权威编程指南第3版》第7章UI fragment与fragment
第7章主要内容是实现一个记录不良行为的APP(部分实现),有列表,有具体的行为内容显示。第7章主要完成单个行为详细信息的UI设置,用以理解fragment初始化的过程。
下面记录一下初始化并加载fragment的一些理解(只粘一些核心代码)
首先,我在主activity的xml文件中引入<FrameLayout>标签,就像一个占位符一样,占好一个空位,id为fragment_container。
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment_container" ></FrameLayout>
主activity的OnCteate方法中是这样初始化的
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = this.getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.fragment_container); if(f == null){ f = new CrimeFragment(); fm.beginTransaction() .add(R.id.fragment_container, f) .commit(); } }
总结起来是这样的:
- 获取FragmentManager,是调用Activity.getSupportFragmentManager()的方法获得。
- 获得findFragmentById(这个方法等同于activity里的findviewbyid)。
- 然后将fragment加入FragmentManager的Transaction中。
- 在FragmentManager里以key, fragment的方式类似Map方式保存。
在Fragment的代码里OnCreate实现参数的初始化:
public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mCrime = new Crime(); }
在OnCreateView方法中实现功能:
View v = inflater.inflate(R.layout.fragment_crime, container, false); this.mTitleFiled = (EditText)v.findViewById(R.id.crime_title); this.mTitleFiled.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { /** * 文本变化自动填充Crime类 */ mCrime.setTitle(s.toString()); } @Override public void afterTextChanged(Editable s) { } }); this.mDateButton = (Button)v.findViewById(R.id.crime_date); this.mDateButton.setText(MyDateUtil.getDateStr(mCrime.getDate(), null)); this.mDateButton.setEnabled(false); this.mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved); this.mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { CrimeFragment.this.mCrime.setSolved(isChecked); } }); return v;
获得View对象,这里不是Activity,不能直接调用,先获取View对象,再用View对象调用
View v = inflater.inflate(R.layout.fragment_crime, container, false);
然后像在Activity中初始化各个组件及相关Listener
this.mTitleFiled = (EditText)v.findViewById(R.id.crime_title);this.mTitleFiled.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
/**
* 文本变化自动填充Crime类
*/
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
最后将View返回,供Activity使用。
return v;