活动(Activity)和碎片(Fragment)在Android开发中占着非常重要的作用,每一个开发者想要开发出丰富多彩的Android项目,那就必须要好好了解这两位小伙伴才行。那么接下来,就让皮卡丘带着大家围观下这两位小伙伴的“搞基”之旅吧。
1、Activity使用Fragment中的方法
这个是比较简单的,首先,因为一般情况下Fragment是依附于Activity的,所以在Activity中可以先获取到Fragment的实例,然后就可以直接调用Fragment中的方法了。我们用代码来验证一下,先建一个MyFragment的类,然后在MyFragment中写一个方法:
public void toastShow() {
Log.i("MyFragment", "去吧皮卡丘");
}
然后在activity中创建MyFragment实例对象,并且调用toastShow()方法:
fragment = new MyFragment();
fragment.toastShow();
OK,执行代码,查看日志
方法执行成功!!!可喜可贺可喜可贺
2、Fragment使用Activity中的方法
所谓好基友,当然不会只是Activity使用Fragment的方法。在Fragment中也可以以类似的途径使用Activity的方法:先以getActivity的方式获取到Activity,然后就可以使用方法了(毕竟好基友,相互赠送礼物的方式比较像也是可以理解的嘛)。但是,这里有一个非常重要的东西要理解,那就是:Fragment中getActivity()获取到的对象不能直接用,必须要类型强转!!!(MainActivity)getActivity()这样才可以!
我们在MainActivity中写一个方法
public String getTestString() {
return "成功执行activity中的方法";
}
然后在MyFragment中调用他
case R.id.button1:
String text1 = ((MainActivity)getActivity()).getTestString();
tv_test.setText(text1);
break;
我们打开模拟器,来看看效果
点击之前
点击之后
方法执行成功!!!可喜可贺可喜可贺
3、Activity响应Fragment中的点击事件
终于到了最激动人心,最基情满满的功能了。
我们试想下这样一种场景:在一个Fragment里面按下一个按钮,然后Activity中根据Fragment中传递过来的参数执行相应的方法。这样的场景其实是非常实用的,我们可以通过接口的方式来实现这样的功能。我们在MyFragment中定义这样的接口
public interface OnButton2ClickListener {
public void OnButton2ClickListener(String showText);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
mListener = (OnButton2ClickListener) activity;
} catch (Exception e) {
// TODO: handle exception
throw new ClassCastException(activity.toString() + "must implement OnButton2ClickListener");
}
}
如果MainActivity没有实现这个接口,MyFragment就会抛出ClassCastException,如果成功了,那么MyFragment就可以调用mListener的方法来与MainActivity共享事件。
OK,那我们接着在MyFragment中添加代码:
case R.id.button2:
String showText = "去吧小火龙";
mListener.OnButton2ClickListener(showText);
break;
然后在MainActivity中实现接口OnButton2ClickListener
public class MainActivity extends Activity implements OnClickListener,
OnButton2ClickListener {
......
@Override
public void OnButton2ClickListener(String showText) {
// TODO Auto-generated method stub
TextView tv_activity = (TextView) findViewById(R.id.tv_activity);
tv_activity.setText(showText);
}
......
}
我们快点打开模拟器来查看Activity和Fragment“爱的结晶”吧
初始界面
点击MyFragment中的“接口方式”按钮之后
大家看到了吗?屏幕最下面的文字变成了“去吧皮卡丘”,说明Activity的确响应了Fragment中的点击事件,可喜可贺可喜可贺~~~
接下来贴出本项目所有的代码,皮卡丘写了非常详细的注解,相信就算是新手小伙伴们也能很快理解。
因为Fragment存在版本兼容性问题,所以建议将AndroidManifest.xml中的minSdkVersion设置成android:minSdkVersion="11"
类文件
MainActivity:
package com.example.fragment;
import com.example.fragment.MyFragment.OnButton2ClickListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
public class MainActivity extends Activity implements OnClickListener,
OnButton2ClickListener {
private Button btn1, btn2;
MyFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
// 创建MyFragment对象
fragment = new MyFragment();
}
private void initView() {
// TODO Auto-generated method stub
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
private void getFragment() {
// TODO Auto-generated method stub
// FragmentManager可以用来管理Activity中的fragment,在Android 3.0(即API 11)时引入,所
// 以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法
FragmentManager fragmentManager = getFragmentManager();
// FragmentTransaction 每一个事务都是同时要执行的一套变化,必须调用commit()才能生效
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
// 再添加之前先移除之前的fragment
beginTransaction.remove(fragment);
// 在beginTransaction事务中加入add动作
beginTransaction.add(R.id.fragment_ll, fragment);
// 如果添加这一行代码,那么用户按下back时会返回前一个fragment状态
beginTransaction.addToBackStack(null);
// 执行事务
beginTransaction.commit();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn1:
getFragment();
break;
case R.id.btn2:
fragment.toastShow();
break;
default:
break;
}
}
// Activity中的方法,提供给Fragment调用
public String getTestString() {
return "成功执行activity中的方法";
}
// 实现Fragment中的接口
@Override
public void OnButton2ClickListener(String showText) {
// TODO Auto-generated method stub
TextView tv_activity = (TextView) findViewById(R.id.tv_activity);
tv_activity.setText(showText);
}
}
MyFragment:
package com.example.fragment;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class MyFragment extends Fragment implements OnClickListener {
OnButton2ClickListener mListener;
private Button button1;
private Button button2;
private TextView tv_test;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment, container, false);
button1 = (Button) view.findViewById(R.id.button1);
button2 = (Button) view.findViewById(R.id.button2);
tv_test = (TextView) view.findViewById(R.id.tv_test);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
return view;
}
// Fragment中的方法,供Activity调用
public void toastShow() {
Log.i("MyFragment", "去吧皮卡丘");
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
// 调用Activity中的方法
String text1 = ((MainActivity)getActivity()).getTestString();
tv_test.setText(text1);
break;
case R.id.button2:
// fragment和activity共享点击事件
String showText = "去吧皮卡丘";
mListener.OnButton2ClickListener(showText);
break;
default:
break;
}
}
// 定义接口
public interface OnButton2ClickListener {
public void OnButton2ClickListener(String showText);
}
// 如果MainActivity没有实现这个接口,MyFragment就会
// 抛出ClassCastException,如果成功了,那么MyFragment就
// 可以调用mListener的方法来与MainActivity共享事件。
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
mListener = (OnButton2ClickListener) activity;
} catch (Exception e) {
// TODO: handle exception
throw new ClassCastException(activity.toString() + "must implement OnButton2ClickListener");
}
}
}
布局文件
activity_main.xml
<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" >
<LinearLayout
android:id="@+id/ll_bottomBtn"
android:layout_width="match_parent"
android:layout_height="150dp"
android:orientation="vertical"
android:layout_alignParentBottom="true"
>
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="跳转到Fragment"
/>
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Activity使用Fragment的方法"
/>
<TextView
android:id="@+id/tv_activity"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Activity"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/fragment_ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/ll_bottomBtn"
android:orientation="vertical"
android:background="#A0A0A0"
></LinearLayout>
</RelativeLayout>
fragment.xml
<?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" >
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment"
android:layout_centerInParent="true"
android:textSize="20sp"
/>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="getActivity()方式"
android:layout_below="@id/tv_test"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/button1"
android:text="接口方式"
/>
</RelativeLayout>
热门评论
皮卡皮卡 皮卡丘(๑´•ω•) 感谢
可喜可贺可喜可贺可喜可贺可喜可贺。。。。
皮卡皮卡 皮卡丘(๑´•ω•)