两个简单实例,学会使用fragment
2015-09-07 13:39
405 查看
实例一,简单Fragment
MainActivity
Activity_Second
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
public class Activity_Second extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
FirstFragment
package com.example.demo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class FirstFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
Button bt_first = (Button) view.findViewById(R.id.bt_first);
bt_first.setText(MainActivity.temp);
bt_first.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent=new Intent(getActivity(),Activity_Second.class);
startActivity(intent);
}
});
return view;
}
}
SecondFragment
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater
.inflate(R.layout.fragment_second, container, false);
Button bt_second = (Button) view.findViewById(R.id.bt_second);
bt_second.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.move_in, R.animator.move_out);
FirstFragment first = new FirstFragment();
ft.replace(R.id.container, first);
ft.commit();
}
});
return view;
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick_btn"
android:text="@string/app_name" />
<RelativeLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>fragmentfirst.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#cba" >
<TextView
android:id="@+id/tv_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="这是第一个Fragment"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/bt_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="点我进入下一个" />
</LinearLayout>fragmentsecond.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#abc"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="这是第二个Fragment"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/bt_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="点我回到第一个" />
</LinearLayout>
实例二, Fragment与activity通信
首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包
然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化.
由于在android的实现机制中fragment和activity会被分别实例化为两个不相干的对象,他们之间的联系由activity的一个成员对象fragmentmanager来维护.fragment实例化后会到activity中的fragmentmanager去注册一下,这个动作封装在fragment对象的onAttach中,所以你可以在fragment中声明一些回调接口,当fragment调用onAttach时,将这些回调接口实例化,这样fragment就能调用各个activity的成员函数了,当然activity必须implements这些接口,否则会包classcasterror
fragment和activity的回调机制又是OOP的一次完美演绎!
下面通过一个例子来说明:
我把Activity的UI分为两个部分,左边和右边,左边用来放置点击的按钮(LeftFragment),右边用来放置对应点击后显示的信息(RightFragment).
Activity的布局layout文件:main.xml
LeftFragment的布局layout:leftfragment.xml
<?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" >
<Button
android:id="@+id/first_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/first_button" />
<Button
android:id="@+id/second_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/second_button" />
<Button
android:id="@+id/third_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/third_button" />
</LinearLayout>
RightFragment的布局layout:rightfragment.xml
<?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/right_show_message"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/holo_orange_dark"
android:textColor="@android:color/white" />
</LinearLayout>
以上是两个fragment和一个Activity的布局文件,下面来看他们的java文件
Activity:
LeftFragment:
public class LeftFragment extends Fragment
{
/** Acitivity要实现这个接口,这样Fragment和Activity就可以共享事件触发的资源了 */
public interface MyListener
{
public void showMessage(int index);
}
private MyListener myListener;
private Button firstButton;
private Button secondButton;
private Button thirdButton;
/** Fragment第一次附属于Activity时调用,在onCreate之前调用 */
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
System.out.println("LeftFragment--->onAttach");
myListener = (MyListener) activity;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
System.out.println("LeftFragment--->onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
System.out.println("LeftFragment--->onCreateView");
return inflater.inflate(R.layout.leftfragment, container, false);
}
@Override
public void onResume()
{
super.onResume();
System.out.println("LeftFragment--->onResume");
firstButton = (Button) getActivity().findViewById(R.id.first_button);
secondButton = (Button) getActivity().findViewById(R.id.second_button);
thirdButton = (Button) getActivity().findViewById(R.id.third_button);
MyButtonClickListener clickListener = new MyButtonClickListener();
firstButton.setOnClickListener(clickListener);
secondButton.setOnClickListener(clickListener);
thirdButton.setOnClickListener(clickListener);
}
/** 按钮的监听器 */
class MyButtonClickListener implements OnClickListener
{
public void onClick(View v)
{
Button button = (Button) v;
if (button == firstButton)
myListener.showMessage(1);
if (button == secondButton)
myListener.showMessage(2);
if (button == thirdButton)
myListener.showMessage(3);
}
}
}
RightFragment
public class RightFragment extends Fragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
System.out.println("RightFragment--->onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
System.out.println("RightFragment--->onCreateView");
return inflater.inflate(R.layout.rightfragment, container, false);
}
}
注意,Fragment的生命周期和Activity生命周期之间的关系。在Activity里动态生成Fragment,首先是Activity调用onCreate()方法,但是这时候还没有加载到Fragment里的组件,当Fragment调用其onCreateView()方法后,Activity才能得到Fragment中的组件
这里最关键的就是Fragment要有一个接口和这个接口的引用,而这个接口需要Activity去实现它。当Fragment调用onAttach(Activity acitivity)方法的时候,将这个activity传递给这个接口引用,这样,就可以和Activity进行交互了.
MainActivity
package com.example.demo; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.view.View; public class MainActivity extends FragmentActivity { public static String temp="weesdf"; public static String getTemp() { return temp; } public static void setTemp(String temp) { MainActivity.temp = temp; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Intent intent=new Intent(MainActivity.this,); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); FirstFragment first = new FirstFragment(); //如果用add()的话会出现不完全覆盖效果 ft.replace(R.id.container, first); ft.commit(); } //切换到第二个fragment public void onClick_btn(View v){ FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); SecondFragment second = new SecondFragment(); ft.replace(R.id.container, second); ft.commit(); } }
Activity_Second
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
public class Activity_Second extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
FirstFragment
package com.example.demo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class FirstFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
Button bt_first = (Button) view.findViewById(R.id.bt_first);
bt_first.setText(MainActivity.temp);
bt_first.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent=new Intent(getActivity(),Activity_Second.class);
startActivity(intent);
}
});
return view;
}
}
SecondFragment
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater
.inflate(R.layout.fragment_second, container, false);
Button bt_second = (Button) view.findViewById(R.id.bt_second);
bt_second.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.move_in, R.animator.move_out);
FirstFragment first = new FirstFragment();
ft.replace(R.id.container, first);
ft.commit();
}
});
return view;
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick_btn"
android:text="@string/app_name" />
<RelativeLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>fragmentfirst.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#cba" >
<TextView
android:id="@+id/tv_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="这是第一个Fragment"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/bt_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="点我进入下一个" />
</LinearLayout>fragmentsecond.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#abc"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="这是第二个Fragment"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/bt_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="点我回到第一个" />
</LinearLayout>
实例二, Fragment与activity通信
首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包
然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化.
由于在android的实现机制中fragment和activity会被分别实例化为两个不相干的对象,他们之间的联系由activity的一个成员对象fragmentmanager来维护.fragment实例化后会到activity中的fragmentmanager去注册一下,这个动作封装在fragment对象的onAttach中,所以你可以在fragment中声明一些回调接口,当fragment调用onAttach时,将这些回调接口实例化,这样fragment就能调用各个activity的成员函数了,当然activity必须implements这些接口,否则会包classcasterror
fragment和activity的回调机制又是OOP的一次完美演绎!
下面通过一个例子来说明:
我把Activity的UI分为两个部分,左边和右边,左边用来放置点击的按钮(LeftFragment),右边用来放置对应点击后显示的信息(RightFragment).
Activity的布局layout文件:main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" android:orientation="vertical" > </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="10" android:orientation="vertical" > </LinearLayout> </LinearLayout>
LeftFragment的布局layout:leftfragment.xml
<?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" >
<Button
android:id="@+id/first_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/first_button" />
<Button
android:id="@+id/second_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/second_button" />
<Button
android:id="@+id/third_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/third_button" />
</LinearLayout>
RightFragment的布局layout:rightfragment.xml
<?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/right_show_message"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/holo_orange_dark"
android:textColor="@android:color/white" />
</LinearLayout>
以上是两个fragment和一个Activity的布局文件,下面来看他们的java文件
Activity:
public class FirstActivity extends Activity implements MyListener { /** * 实现MyListener,当LeftFragment中点击第一页的时候,让RightFragment显示第一页信息,同理当点击第二页的时候,RightFragment显示第二页信息 * * @param index * 显示的页数 */ public void showMessage(int index) { if (1 == index) showMessageView.setText(R.string.first_page); if (2 == index) showMessageView.setText(R.string.second_page); if (3 == index) showMessageView.setText(R.string.third_page); } /** 得到RightFragment中显示信息的控件 */ private TextView showMessageView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("Activity--->onCreate"); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); // 动态增加Fragment RightFragment rightFragment = new RightFragment(); LeftFragment leftFragment = new LeftFragment(); transaction.add(R.id.left_layout, leftFragment, "leftfragment"); transaction.add(R.id.right_layout, rightFragment, "rightfragment"); transaction.commit(); } @Override protected void onResume() { super.onResume(); System.out.println("Activity--->onResume"); //注意:findview放到这里 showMessageView = (TextView) findViewById(R.id.right_show_message); } }
LeftFragment:
public class LeftFragment extends Fragment
{
/** Acitivity要实现这个接口,这样Fragment和Activity就可以共享事件触发的资源了 */
public interface MyListener
{
public void showMessage(int index);
}
private MyListener myListener;
private Button firstButton;
private Button secondButton;
private Button thirdButton;
/** Fragment第一次附属于Activity时调用,在onCreate之前调用 */
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
System.out.println("LeftFragment--->onAttach");
myListener = (MyListener) activity;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
System.out.println("LeftFragment--->onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
System.out.println("LeftFragment--->onCreateView");
return inflater.inflate(R.layout.leftfragment, container, false);
}
@Override
public void onResume()
{
super.onResume();
System.out.println("LeftFragment--->onResume");
firstButton = (Button) getActivity().findViewById(R.id.first_button);
secondButton = (Button) getActivity().findViewById(R.id.second_button);
thirdButton = (Button) getActivity().findViewById(R.id.third_button);
MyButtonClickListener clickListener = new MyButtonClickListener();
firstButton.setOnClickListener(clickListener);
secondButton.setOnClickListener(clickListener);
thirdButton.setOnClickListener(clickListener);
}
/** 按钮的监听器 */
class MyButtonClickListener implements OnClickListener
{
public void onClick(View v)
{
Button button = (Button) v;
if (button == firstButton)
myListener.showMessage(1);
if (button == secondButton)
myListener.showMessage(2);
if (button == thirdButton)
myListener.showMessage(3);
}
}
}
RightFragment
public class RightFragment extends Fragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
System.out.println("RightFragment--->onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
System.out.println("RightFragment--->onCreateView");
return inflater.inflate(R.layout.rightfragment, container, false);
}
}
注意,Fragment的生命周期和Activity生命周期之间的关系。在Activity里动态生成Fragment,首先是Activity调用onCreate()方法,但是这时候还没有加载到Fragment里的组件,当Fragment调用其onCreateView()方法后,Activity才能得到Fragment中的组件
这里最关键的就是Fragment要有一个接口和这个接口的引用,而这个接口需要Activity去实现它。当Fragment调用onAttach(Activity acitivity)方法的时候,将这个activity传递给这个接口引用,这样,就可以和Activity进行交互了.
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories