fragment新特性(重点)
1.fragment入门
Android3.0开始引入这个框架,主要用来实现一个多任务的界面。 fragment是activity的子界面了,运行在activity上面的。
代码:
package com.qaa.fragment;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm = this.getFragmentManager();
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment01 f01 = new Fragment01();
ft.replace(R.id.fm_container, f01);
ft.commit();
}
public void open01(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment01 f01 = new Fragment01();
ft.replace(R.id.fm_container, f01);
ft.commit();
}
public void open02(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment02 f02 = new Fragment02();
ft.replace(R.id.fm_container, f02);
ft.commit();
}
public void open03(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment03 f03 = new Fragment03();
ft.replace(R.id.fm_container, f03);
ft.commit();
}
}
2.fragment的向下兼容
为了能够向下兼容低版本的API,让所有与fragment相关的API都从support.vx包中导入。
代码: **
package com.qaa.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
public class MainActivity extends FragmentActivity {
private FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm = this.getSupportFragmentManager();
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment01 f01 = new Fragment01();
ft.replace(R.id.fm_container, f01);
ft.commit();
}
public void open01(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment01 f01 = new Fragment01();
ft.replace(R.id.fm_container, f01);
ft.commit();
}
public void open02(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment02 f02 = new Fragment02();
ft.replace(R.id.fm_container, f02);
ft.commit();
}
public void open03(View view){
//开启一个打开界面的事务,保证几个界面同时打开成功,同时打开失败。
FragmentTransaction ft = fm.beginTransaction();
Fragment03 f03 = new Fragment03();
ft.replace(R.id.fm_container, f03);
ft.commit();
}
}
3.fragment的数据传递 从activity中传数据给fragment:
在activity中调用fragment的方法;
代码:
//调用fragment的一个方法,把数据传递过去 f01.setInfoToTextView(info);
4.fragment修改activity的数据 从fragment中传递数据给activity:
在fragment中得到activity的实例对象,掉用它的方法传递数据;
代码:
package com.qaa.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment01 extends Fragment {
private TextView tv;
private Button bt;
private EditText et_data;
/**
* 创建fragment对象时调用这个方法,初始化fragment的界面
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = View.inflate(getActivity(), R.layout.fragment01, null);
tv = (TextView) view.findViewById(R.id.tv);
et_data = (EditText) view.findViewById(R.id.et_data);
bt = (Button) view.findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//得到运行fragment的activity的实例对象
FragmentActivity fa = getActivity();
String data = et_data.getText().toString().trim();
//得到mainactivity的实例对象
if(fa instanceof MainActivity){
//调用mainactivity的方法,传递数据
((MainActivity) fa).setInfo(data);
}
}
});
return view;
}
}
5.fragment的生命周期
onCreate:
onCreateView:
onResume:
onStart:
onPause:
onStop:
onDestroyView:
onDestroy:
#属性动画
1.为什么使用属性动画
使用其他的动画对象,让控件在动画期间时不能使事件与控件对象绑定在一起。为了让事件与空间对象绑定在一起,需要使用属性动画来实现。
2.属性动画入门
模版代码:
//创建一个属性动画对象
//sport 动画做到哪个目标对象上
//translationX 哪个属性的变化过程
//动画过程中使用的属性数值(可变参数,快一些多个值)
ObjectAnimator oa = ObjectAnimator.ofFloat(sport, "translationX", 20,40,80,120,160,200);
oa.setDuration(2000);
oa.setRepeatCount(2);
oa.setRepeatMode(ObjectAnimator.REVERSE);
oa.start();
3.3种常见属性动画
旋转:rotate 缩放:scale 透明度:alpha
代码:
package com.qaa.propertyanim;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView xfj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xfj = (ImageView) findViewById(R.id.xfj);
}
public void trans(View view) {
// 创建一个属性动画对象
// sport 动画做到哪个目标对象上
// translationX 哪个属性的变化过程
// 动画过程中使用的属性数值(可变参数,快一些多个值)
ObjectAnimator oa = ObjectAnimator.ofFloat(xfj, "translationX", 20, 40,80, 120, 160, 200);
oa.setDuration(2000);
oa.setRepeatCount(2);
oa.setRepeatMode(ObjectAnimator.REVERSE);
oa.start();
}
public void rotate(View view) {
// 创建一个属性动画对象
// sport 动画做到哪个目标对象上
// translationX 哪个属性的变化过程
// 动画过程中使用的属性数值(可变参数,快一些多个值)
ObjectAnimator ra = ObjectAnimator.ofFloat(xfj, "rotation", 30,60,90,120,150,180,210,240,270,300,330,360);
ra.setDuration(2000);
ra.setRepeatCount(2);
ra.setRepeatMode(ObjectAnimator.REVERSE);
ra.start();
}
public void scale(View view) {
// 创建一个属性动画对象
// sport 动画做到哪个目标对象上
// translationX 哪个属性的变化过程
// 动画过程中使用的属性数值(可变参数,快一些多个值)
ObjectAnimator sa = ObjectAnimator.ofFloat(xfj, "scaleY", 0.1f,0.3f,0.5f,0.8f,1.0f,1.2f,1.4f,1.6f,1.8f,2.0f);
sa.setDuration(2000);
sa.setRepeatCount(2);
sa.setRepeatMode(ObjectAnimator.REVERSE);
sa.start();
}
public void alpha(View view) {
// 创建一个属性动画对象
// sport 动画做到哪个目标对象上
// translationX 哪个属性的变化过程
// 动画过程中使用的属性数值(可变参数,快一些多个值)
ObjectAnimator aa = ObjectAnimator.ofFloat(xfj, "alpha", 0.1f,0.2f,0.4f,0.6f,0.8f,1.0f);
aa.setDuration(3000); aa.setRepeatCount(2); aa.setRepeatMode(ObjectAnimator.REVERSE);
aa.start(); }
public void set(View view) {
AnimatorSet set = new AnimatorSet();
ObjectAnimator oa = ObjectAnimator.ofFloat(xfj, "translationX", 20, 40, 80, 120, 160, 200); oa.setDuration(2000); oa.setRepeatCount(2); oa.setRepeatMode(ObjectAnimator.REVERSE);
ObjectAnimator ra = ObjectAnimator.ofFloat(xfj, "rotation", 30,60,90,120,150,180,210,240,270,300,330,360); ra.setDuration(2000); ra.setRepeatCount(2); ra.setRepeatMode(ObjectAnimator.REVERSE); ObjectAnimator sa = ObjectAnimator.ofFloat(xfj, "scaleY", 0.1f,0.3f,0.5f,0.8f,1.0f,1.2f,1.4f,1.6f,1.8f,2.0f); sa.setDuration(2000); sa.setRepeatCount(2); sa.setRepeatMode(ObjectAnimator.REVERSE); ObjectAnimator aa = ObjectAnimator.ofFloat(xfj, "alpha", 0.1f,0.2f,0.4f,0.6f,0.8f,1.0f); aa.setDuration(3000); aa.setRepeatCount(2); aa.setRepeatMode(ObjectAnimator.REVERSE);
//
set.playSequentially(oa,ra,sa,aa);
//四中动画类型组合一起播放
set.playTogether(oa,ra,sa,aa); set.start();
}
}