Fragment初识之静态显示
1.创建一个工程,新建一个包专门存放Fragment,在包下新建一个类,继承至本包下的Fragment。
2.由于是继承至本包下的Fragment,所以会报错,在AndroidMenifest.xml中将最小sdk版本改为11即可(即支持3.0以上版本)。
3.重写onCreateView方法,为Fragment创建UI有两种方法,先说第一种手工创建,适合较简单的UI布局。
package com.example.fragment;
import android.app.Fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
//创建时继承fragment 选择当前包,不选V4包 出错时在menifest.xml文件中
//将最小sdk改为11 即3.0以上版本
public class hello_Fragment extends Fragment {
// 重写onCreateView方法
/**
* LayoutInflater 布局资源加载器 ViewGroup 当前Fragment所在的父容器对象 Bundle 存放保存的业务数据
* 数据在onSaveInstanceSatate()中保存
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
// 为Fragment创建UI控件
// 第一种方式:通过布局加载器加载布局文件(推荐);第二:手工创建
// fragment.getActivity()方法返回显示当前Fragment的对象
// Fragment必须在Activity中显示,所在的Activity又称为归属Activity
// 下边是手工创建
TextView tv = new TextView(getActivity());// 获取Fragment的归属Activity
tv.setText("Hello Fragment");
tv.setTextSize(30);
tv.setTextColor(Color.BLUE);
// 获取类型数值对象,将普通的对象转换为与密度有关的dp单位值
int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 10, getResources()
.getDisplayMetrics());
// getResources().getDisplayMetrics()获取当前屏幕测量对象(高度,宽度,密度....)
tv.setPadding(padding, padding, padding, padding);
return tv;
}
}
接下来需要在主布局中写fragment<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<!-- 1.以静态方式显示 <fragment>标签 并且必须指定id或tag属性来标识碎片的唯一性 通过android:name 来指定显示的Fragment类 -->
<fragment
android:id="@+id/fragment1"
android:name="com.example.fragment.editFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
这里的name即为自己定义的Fragment类,不可选错。
无误后即可运行。
第二种是在xml文件中写布局,然后加载到Fragment中:
package com.example.fragment;
import com.example.android_fragment01.R;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
public class editFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_edit, null);
final EditText name = (EditText) view.findViewById(R.id.name);
view.findViewById(R.id.button1).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
getActivity().setTitle(name.getText());
}
});
;
return view;
}
}
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
android:inputType="text" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/name"
android:layout_marginRight="20dp"
android:layout_marginTop="42dp"
android:text="Button" />
</RelativeLayout>
这里注意Fragment对应的xml文件命名一fragment开头。
如果需要添加事件,可以再fragment类中添加,也可以在Activity中添加,重要的是找到相应的组件,也是难点。
特别提醒:由于本例是继承至当前包的fragment,所以任何地方需要导入时都是当前包,不可用Ctrl+Shift+O快捷导入,会出错(亲测会出错!!!!!)。