如何在BaseFragment中直接调用BaseActivity中相关属性代码的问题

通常我们要写多个Activity时,很多属性是相同的,为了减少代码量,我们通常写一个BaseActivity来继承自Activity,再让其他的新创建的Activity继承自BaseActivity即可,一般BaseActivity可以这样写,都是套路性的东西,记住怎么写就可以了,实例如下:

package com.example.catmessage.ui;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import cn.bmob.im.BmobChat;
import cn.bmob.im.BmobChatManager;
import cn.bmob.im.BmobUserManager;
import cn.bmob.im.db.BmobDB;
import cn.bmob.v3.listener.UpdateListener;


import com.example.catmessage.R;
import com.example.catmessage.app.MyApp;
import com.example.catmessage.bean.User;
import com.example.catmessage.constant.Constant.Position;

public class BaseActivity extends FragmentActivity{

//声明几个在利用BmobIMSDK进行聊天和用户管理时频繁需要使用到的属性
BmobUserManager bmobUserManager; //所有用户管理相关的操作需要依赖该对象
BmobChatManager bmobChatManager; //所有与聊天相关的操作需要依赖该对象
BmobDB bmobDB; //所有缓存在本地数据库的数据操作需要依赖该对象

Toast toast;

@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
bmobUserManager = BmobUserManager.getInstance(this);
bmobChatManager = BmobChatManager.getInstance(this);
bmobDB = BmobDB.create(this);
toast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
}

//设置头部布局的方法
public void setHeaderTitle(View headerView,String title,Position position){
TextView tv = (TextView) headerView.findViewById(R.id.tv_header_title);

if(title==null){
tv.setText("TITLE");
}else{
tv.setText(title);
}


switch (position) {
case LEFT:
tv.setGravity(Gravity.LEFT);
break;

default:
tv.setGravity(Gravity.CENTER);
break;
}

}
//重载方法,设置标题时不指定位置,就让标题居中显示
public void setHeaderTitle(View headerView,String title){
setHeaderTitle(headerView, title, Position.CENTER);
}

/**

* @param headerView
* @param resId
* @param position LEFT 是设置头部左侧的ImageView
*                 RIGHT 、 CENTER均为设置头部右侧的ImageView
* @param listener 
*/
public void setHeaderImage(View headerView,int resId,Position position,OnClickListener listener){
ImageView iv = null;
switch (position) {
case LEFT:
iv = (ImageView) headerView.findViewById(R.id.iv_header_left);
break;

default:
iv = (ImageView) headerView.findViewById(R.id.iv_header_right);
break;
}

iv.setImageResource(resId);

if(listener!=null){
iv.setOnClickListener(listener);
}
}

public void setHeaderImage(View headerView,int resId,Position position){
setHeaderImage(headerView, resId, position, null);
}

public void setHeaderImage(View headerView,int resId){
setHeaderImage(headerView, resId, Position.LEFT);
}

//写一些打印“吐司”和Log的方法

public void toast(String text){

if(TextUtils.isEmpty(text)){
return;
}
toast.setText(text);
toast.show();
}

public void log(String log){
if(BmobChat.DEBUG_MODE)
Log.d("TAG",this.getClass().getSimpleName()+": "+log);
}
public void toastAndLog(String text,String log){
toast(text);
log(log);
}

//写一些界面跳转的方法
//简单的界面跳转,不需要利用Intent传递参数
public void jumpTo(Class<?> clazz,boolean isFinish){
Intent intent = new Intent(this,clazz);
startActivity(intent);
if(isFinish){
finish();
}
}

//界面跳转时,需要Intent携带参数
public void jumpTo(Intent intent,boolean isFinish){
startActivity(intent);
if(isFinish){
finish();
}
}

//TODO 更新用户位置的方法

public void updateLocation(){
User user = bmobUserManager.getCurrentUser(User.class);
user.setLocation(MyApp.lastPoint);
user.update(this, new UpdateListener() {

@Override
public void onSuccess() {
toast("更新位置成功");
}

@Override
public void onFailure(int arg0, String arg1) {
toastAndLog("服务器繁忙,稍后重试", arg0+": "+arg1);
}
});
}

/**
* 判断用户在EditText中输入的信息是否完整
* @param editTexts
* @return false 意味着用户输入的是完整的
*         true  意味着至少有一个EditText用户未输入内容
*/

public boolean isEmpty(EditText... editTexts){

for(EditText et:editTexts){
if(TextUtils.isEmpty(et.getText().toString())){
et.setError("请输入完整");
return true;
}
}

return false;
}

}

这样一个比较完整的BaseActivity就基本完成的,需要相应的功能可以继续往里面添加即可

同样的我们在写Fragment的时候,一般也需要写很多个,我们也可以将相同的属性代码进行提取,放到BaseFragment中,再让其他Fragment继承自BaseFragment即可,一般写法如下:

package com.example.catmessage.fragment;


import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import cn.bmob.im.BmobChat;
import cn.bmob.im.BmobChatManager;
import cn.bmob.im.BmobUserManager;
import cn.bmob.im.db.BmobDB;


import com.example.catmessage.R;
import com.example.catmessage.app.MyApp;
import com.example.catmessage.constant.Constant.Position;
import com.example.catmessage.ui.BaseActivity;


public class BaseFragment extends Fragment{

//声明几个在利用BmobIMSDK进行聊天和用户管理时频繁需要使用到的属性
BmobUserManager bmobUserManager; //所有用户管理相关的操作需要依赖该对象
BmobChatManager bmobChatManager; //所有与聊天相关的操作需要依赖该对象
BmobDB bmobDB; //所有缓存在本地数据库的数据操作需要依赖该对象

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bmobUserManager = BmobUserManager.getInstance(MyApp.context);
bmobChatManager = BmobChatManager.getInstance(MyApp.context);
bmobDB = BmobDB.create(MyApp.context);
}

//设置头部布局的方法
//设置标题
public void setHeaderTitle(View headerView,String title,Position position){
FragmentActivity activity = getActivity();
((BaseActivity)activity).setHeaderTitle(headerView, title, position);
}
//设置图片
public void setHeaderImage(View headerView,int resId,Position position,OnClickListener listener){
ImageView iv = null;
switch (position) {
case LEFT:
iv = (ImageView) headerView.findViewById(R.id.iv_header_left);
break;
default:
iv = (ImageView) headerView.findViewById(R.id.iv_header_right);
break;
}
iv.setImageResource(resId);
if(listener!=null){
iv.setOnClickListener(listener);
}
}

public void jumpTo(Class<?> clazz,boolean isFinish){
Intent intent = new Intent(getActivity(),clazz);
startActivity(intent);
if(isFinish){
getActivity().finish();
}
}

public void jumpTo(Intent intent,boolean isFinish){
startActivity(intent);
if(isFinish){
getActivity().finish();
}
}

public void toast(String text){
((BaseActivity)getActivity()).toast(text);
}
public void log(String log){
if(BmobChat.DEBUG_MODE)
Log.d("TAG",this.getClass().getSimpleName()+":"+log);
}
}

在这里需要注意的是在BaseActivity中有的代码,我们在BaseFragment中也需要用,我们有两种方式解决,第一是将BaseActivity中的代码直接copy过去;第二是通过调用的方式(注意需要类型强转):

如在BaseFragment中:

public void setHeaderTitle(View headerView,String title,Position position){
FragmentActivity activity = getActivity();
((BaseActivity)activity).setHeaderTitle(headerView, title, position);

}

又如:public void toast(String text){
((BaseActivity)getActivity()).toast(text);
}



补充:

还有一点需要注意的是,我们在Fragment中使用黄油刀需要注意绑定方式,在onCreateView()方法中可以这样写

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_setting, container, false);
spUtil=new SharedPreferenceUtil(bmobUserManager.getCurrentUserObjectId());
ButterKnife.bind(this,view);
initHeaderView();
initView();
return view;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值