本文源自《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;