1 fragment入门
ViewGroup特点:可以有自己的孩子(比如布局)
View:不能有自己的孩子
【1】通过onCreateView这个方法,Fragment可以加载自己的布局
【2】name属性指定的是一个我们自己定义的Fragment
【3】直接在布局中声明即可
核心代码:
//定义fragment 理解为 是Activity的一部分
public class Fragment1 extends Fragment {
//当系统第一次画UI得时候调用 通过这个方法可以让Fragment显示自己的布局内容
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//通过打气筒把一个布局转换成一个View对象
View view = inflater.inflate(R.layout.fragment1, null);
return view;
}
}
public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, null);
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.itheima.fragmentdemo.Fragment1"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.itheima.fragmentdemo.Fragment2"
android:id="@+id/viewer"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
2 动态替换fragment
【1】获取fragment的管理者
【2】开启一个事务
【3】提交
代码:
//[1]获取手机分辨率
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int weight = point.x;
int height = point.y;
//[2]判断横竖屏
//[3]通过上下文直接获取fragment的管理者
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
if (height > weight) {
//说明是竖屏 加载一个fragment android.R.id.content代表当前手机的窗体
beginTransaction.replace(android.R.id.content, new Fragment1());
}else {
//说明是横屏 加载一个fragment
beginTransaction.replace(android.R.id.content, new Fragment2());
}
//[4]最后一步 一定要commit
beginTransaction.commit();
3 使用fragment兼容低版本的写法
【1】fragment是在11的时候被引入的
【2】兼容低版本的写法就是所有的fragment全部使用V4包中的fragment
【3】fragment必须继承FragmentActivity
4 Fragment的生命周期
实际开发中,必须要重写一个方法:onCreateView()方法
还可以重写onDestroy()方法,进行一些回收内存的操作
5 Fragment之间的通信
//通过打气筒把一个布局转换成一个View对象
View view = inflater.inflate(R.layout.fragment1, null);
//[1]找到按钮 设置点击事件
view.findViewById(R.id.update).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//[2]修改fragment2里面的内容 通过fragment的公共桥梁 ---> activity
Fragment2 fragment2 = (Fragment2) getActivity().getFragmentManager().findFragmentByTag("f2");
fragment2.updateText("哈哈哈呵呵呵");
}
});
6 声明菜单
[1]声明菜单
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//当我们想知道具体点击的是哪个菜单条目 重写下面这个方法(固定流程)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//具体点击的是哪个菜单的条目
switch (item.getItemId()) {
case R.id.action_setting1:
System.out.println("111111");
break;
case R.id.action_setting2:
System.out.println("222222");
break;
}
return super.onOptionsItemSelected(item);
}
[2]动态的添加菜单(代码的方式)
public boolean onCreateOptionsMenu(Menu menu) {
//[2]通过代码的方式添加
menu.add(0, 1, 0, "前进");
menu.add(0, 2, 0, "后退");
menu.add(0, 3, 0, "首页");
return true;
}
//当我们想知道具体点击的是哪个菜单条目 重写下面这个方法(固定流程)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//具体点击的是哪个菜单的条目
switch (item.getItemId()) {
case 1:
System.out.println("前进");
break;
case 2:
System.out.println("后退");
break;
case 3:
System.out.println("首页");
break;
}
return super.onOptionsItemSelected(item);
}
[3]弹出一个对话框
//当菜单打开之前 调用这个方法
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
//弹出一个对话框
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("警告");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
}
});
7 AutoCompleteTextView控件的使用
AutoCompleteTextView显示数据的原理和ListView的原理一样,也需要数据适配器!!!
private String[] COUNTRIES = new String[] {
"Belgium", "France", "Italy", "Germany", "Spain"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]找到控件
AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.actv);
//[2]actv这个控件显示数据的原理和listview一样 需要一个数据适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, COUNTRIES);
//[3]显示数据
actv.setAdapter(adapter);
}
8 补间动画
View动画
【1】透明 AlphaAnim
【2】旋转 RorateAnimation
【3】缩放 ScaleAnimation
【4】位移 TranslateAnimation
原理:动画效果不会改变控件真实的坐标
9 使用xml方式定义补间动画
【1】就是在res下创建一个目录(anim)
【2】在该目录下创建对应的动画即可!
10 属性动画
原理:会改变控件的真实坐标
ObjectAnimation 它不是new出来的 是通过静态方法拿到实例的
11 应用程序的反编译
apktools:可以获取res下资源文件
dex2jar:可以把apk转换成jar
jd-gui.exe:可以直接查看源码
一个大神编写了一个图形界面的应用,可以直接使用,叫:Android逆向助手!!
Android逆向助手里面,点击dex转jar可以查看源码。
12通知栏的介绍
【1】Toast
【2】对话框
【3】通知栏
SmsManager:发送短信
TelephyManager:电话管理者
WindowManager:窗口的管理者(获取手机分辨率)
FragmentManager:fragment的管理者
NotificationManager:通知的管理者
13 通知和服务的连用
可以提升进程的优先级