[android]p7-1 fragment学习笔记

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

总结起来是这样的:

  1. 获取FragmentManager,是调用Activity.getSupportFragmentManager()的方法获得。
  2. 获得findFragmentById(这个方法等同于activity里的findviewbyid)。
  3. 然后将fragment加入FragmentManager的Transaction中。
  4. 在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;
posted @ 2020-03-11 15:44  奥卡修罗  阅读(148)  评论(0编辑  收藏  举报