在说Fragment的加载方式之前,简单笼统地介绍一下Fragment大概使用。
和Activity一样,每次要出现新的Fragment都需要定义Fragment类(需要继承Fragment类),一个Fragment类需要自己的子布
局layout。
Fragment的加载方式分两种:静态加载和动态加载。
做一个导航来展示静态和动态加载。
1、静态加载
先来创建静态加载的Fragment的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/fg_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/fg_bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改变text"
/>
</LinearLayout>
再来创建一个Fragment类,继承自Fragment。
package com.example.fragmenttest;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
/*
* resource: Fragment布局文件
* root: 加载Layout的父Viewgroup
* attachToRoot:false,不返回父viewgroup
*/
View view = inflater.inflate(R.layout.fragment1, container, false);
TextView tv = (TextView) view.findViewById(R.id.fg_tv);
tv.setText("静态加载");
return view;
}
}
调用其中的oncreateview方法,我们要将layout布局文件转换为视图。
inflater.inflate(resource, root, attachToRoot);
其中代码中把ViewGroup就当作layout布局文件,例如: LinearLayout、RelativeLayout等等。
之前咱们是直接使用findviewById,那是因为我们已经在Activity的oncreate方法中载入了布局文件,这里我们需要获得布局之后
才可以使用这个方法,view就是其布局文件转换的视图。
可以初始化控件并且通过代码设置控件内容。
手机是通过两个Fragment在两个Activity跳转来实现,所以需要再定义一个Activity的布局文件(main2),里面只有Fragment标签(大房子里面造房间):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/main_fl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.fragmenttest.MyFragment"
></fragment>
</LinearLayout>
在Activity的layout中需要声明Fragment,在其标签内必须用name属性指定在layout中实例化的Fragment类(因为一个
Fragment类肯定有一个Fragment布局文件对应它)。
标识Fragment:id、tag两个属性都可以获得唯一标识。
Fragment类做好了以后,我们将它部署在另一个Activity中(其实是Activity加载它的带有Fragment的布局文件(main2),通过布局文件
中对应name的Fragment类来加载的):
package com.example.fragmenttest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity2 extends Activity{
private Button bt;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
bt =(Button) findViewById(R.id.fg_bt);
tv=(TextView) findViewById(R.id.fg_tv);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tv.setText("改变了!");
}
});
}
}
这里主要想说的一点,在大房子Activity中加载了main2的布局文件,是可以直接findviewbyid的,因为在大房子Activity是可以找
到房间Fragment中的控件ID的,在加载房子的布局文件时已经深入到房间的布局文件及控件,直接可以findview,也就是说
Fragment中的布局文件对于Activity本身也是共享它里面的UI控件的。
我们可以通过点击静态加载这个按钮来展示静态加载Fragment效果,按钮在这里使用的是radiogroup:
Mainactivity:
package com.example.fragmenttest;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class MainActivity extends Activity {
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rg = (RadioGroup) findViewById(R.id.main_rg);
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
switch (checkedId) {
case R.id.main_bt:
Intent intent=new Intent();
intent.setClass(MainActivity.this, MainActivity2.class);
startActivity(intent);
break;
case R.id.main_bt1:
break;
case R.id.main_bt2:
break;
case R.id.main_bt3:
break;
default:
break;
}
}
});
}
}
点击后效果图: