工具类由来:
每次跳转到其他的Activity我们都要实例化一个Intent,有时为了传递数据还要实例化一个Bundle,这些代码说多不多但是说少也不少,于是我便想着如果能够将跳转的功能封装一下,是不是就能够稍微偷点懒呢?
先看下使用方法真的很简单:
//实现JumpInterface接口
public class JumpUtilTestActivity extends AppCompatActivity implements JumpUtil.JumpInterface {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//直接跳转
JumpUtil.GotoActivity(this, MainActivity.class);
//带着Bundle直接跳转
JumpUtil.GotoActivity(this, new Bundle(), MainActivity.class);
//跳转返回结果
JumpUtil.GotoActivityForResult(this, MainActivity.class, new Bundle(), 200);
}
}
fragment也是同样的使用方法,是不是省去了很多重复的代码。
封装思路:
根据实际开发经验跳转常用的有这两种方式:
1.不带任何数据直接跳转到另外一个Activity.
2.需要通过Bundle带一些数据到另外一个Activity.
于是我们可以抽象出2个静态方法:
/**
* 跳转到目标Activity
*
* @param aimClass
*/
public static void GotoActivity(Object object, Bundle bundle, Class aimClass) {
if (object == null) return;
Intent intent = new Intent();
intent.setClass(app, aimClass);
if (bundle != null) {
intent.putExtras(bundle);
}
if (object instanceof Fragment) {
((Fragment) object).startActivity(intent);
} else if (object instanceof Activity) {
((Activity) object).startActivity(intent);
}
}
/**
* startActivityForResult
*
* @param aimClass
* @param bundle
* @param requestCode
*/
public static void GotoActivityForResult(Object object, Class aimClass, Bundle bundle, int requestCode) {
if (object == null) return;
Intent intent = new Intent();
intent.setClass(app, aimClass);
if (bundle != null) {
intent.putExtras(bundle);
}
if (object instanceof Fragment) {
((Fragment) object).startActivityForResult(intent, requestCode);
} else if (object instanceof Activity) {
((Activity) object).startActivityForResult(intent, requestCode);
}
}
这样功能确实是实现了但是总觉得不够代码优雅,如何让Fragment和Activity都能够使用的同时,不需要在方法内部判断传入的是什么类型呢?
我们知道跳转调用的是Fragment与Activity的startActivity()与startActivityForResult()两个方法,既然2个类都有相同的方法实现那我们为什么不干脆创建一个接口让接口带有这两个方法呢?
/**
* 跳转接口
* Created by z2wenfa on 2016/3/23.
*/
public interface JumpInterface {
/**
* 跳转到activity
*
* @param intent
*/
void startActivity(Intent intent);
/**
* 跳转到activi并且返回内容
*
* @param intent
* @param requestcode
*/
void startActivityForResult(Intent intent, int requestcode);
}
因为这2个方法Fragment和Activity都已经实现好了我们只需要在实现基类的时候实现一下这个接口就能够在直接使用这个工具类进行跳转了。
完整代码如下:
/**
* Activity或者fragment跳转工具类
* Created by z2wenfa on 2016/9/19.
*/
public class JumpUtil {
public static Context app;
public static void init(Context context) {
app = context;
}
/**
* 跳转到目标Activity(传递Parcelable)
*
* @param jumpInterface
* @param aimClass
* @param key
* @param parcelable
*/
public static void GotoActivity(JumpInterface jumpInterface, Class aimClass, String key, Parcelable parcelable) {
if (jumpInterface == null) return;
Intent intent = new Intent();
intent.setClass(app, aimClass);
intent.putExtra(key, parcelable);
jumpInterface.startActivity(intent);
}
/**
* 跳转到目标Activity(需要带Bundle)
*
* @param bundle
* @param aimClass
*/
public static void GotoActivity(JumpInterface jumpInterface, Bundle bundle, Class aimClass) {
if (jumpInterface == null) return;
Intent intent = new Intent();
if (bundle != null) intent.putExtras(bundle);
intent.setClass(app, aimClass);
jumpInterface.startActivity(intent);
}
/**
* 跳转到目标Activity
*
* @param aimClass
*/
public static void GotoActivity(JumpInterface jumpInterface, Class aimClass) {
if (jumpInterface == null) return;
Intent intent = new Intent();
intent.setClass(app, aimClass);
jumpInterface.startActivity(intent);
}
/**
* startActivityForResult
*
* @param aimClass
* @param bundle
* @param requestCode
*/
public static void GotoActivityForResult(JumpInterface jumpInterface, Class aimClass, Bundle bundle, int requestCode) {
if (jumpInterface == null) return;
Intent intent = new Intent();
intent.setClass(app, aimClass);
if (bundle != null) intent.putExtras(bundle);
jumpInterface.startActivityForResult(intent, requestCode);
}
/**
* 跳转接口
* Created by z2wenfa on 2016/3/23.
*/
public interface JumpInterface {
/**
* 跳转到activity
*
* @param intent
*/
void startActivity(Intent intent);
/**
* 跳转到activi并且返回内容
*
* @param intent
* @param requestcode
*/
void startActivityForResult(Intent intent, int requestcode);
}
代码是不是看起来稍微优雅了点呢?这样一个跳转的工具类就完成了,以后再也看不到那么多重复的跳转代码了。