在很多的App中都涉及到界面刷新的问题和传值的问题:
这里我总结了下界面刷新:
1.很多人都会利用Activity的生命周期来刷新列表
常见的有Onresume() 和Onrestart();
到家都知道Activity的生命周期,当前的Activity重新显示的时候,onCreate()方法不会被执行,但是Onrestart()和Onresume方法一定会被执行,所以不少的人都在这里刷新界面。
2.onActivityResult 也是大家经常使用的,这个更为灵活,还可以在Activity之间传值 (刷新和传值)
//启动的代码
Intent intent = new Intent(context,NewIncraditActivity.class);
startActivityForResult(intent, 1);
//回调刷新界面
<pre name="code" class="html">public void onActivityResult(int requestCode, int resultCode, Intent data) {
//如果传值过来就用data.getXX()来接收
}
//调用回调onActivityResult
Intent intent = new Intent();
setResult(2);//如果不需要回传值的话就可以这样通知刷新 如果需要传值的话就用intent.putXX();
3.广播(刷新界面和传值)
//注册广播
String myAction = "AAAA";
ReceiveBroadCast receiveBroadCast = new ReceiveBroadCast()
IntentFilter filter = new IntentFilter();
filter.addAction(myActionName); // 只有持有相同的action的接受者才能接收此广播</span>
registerReceiver(receiveBroadCast, filter);
}
// 定义一个BroadcastReceiver广播接收类:
public class ReceiveBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent data) {
String actionName = data.getAction();
if (actionName.equals(actionName)) {
// 得到广播中得到的数据,并显示出来
if (data != null) {
tv_functionName.setText(data.getStringExtra("function"));
}
}
}
}
//注销广播
// 一定要在界面销毁的时候注销广播接收器
@Override
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(receiveBroadCast);// 注销广播接收器
AccountUtils.setFunction_Position(context, "");
}
//发送广播
Intent intent = new Intent("AAAA");
intent.putExtra("function", "行业");
sendBroadcast(intent);
4.Intent传值想必大家每天都在用 新手自已传递对象时要实现序列化
5.接口回调(传值)
一般接口回调在Android中的应用都是暴露个接口将值传递出去,常见的就是自定义的View和Activity之间传值
举个例子对时间弹出框的监听
1.写一个接口类,里面设置监听的方法onTimeListener()
public interface TimeLinstener {
/ * @function 时间监听
* @param year 年
* @param month 月
* @param day 日
* @param isclickit true=至今被点击 false=至今没被点击
* */
void onTimeListener(int year,int month,int day,boolean isclickit);
}
//Dilog类 在自定义的类中(为接口TimeListener.onTimeListener()方法赋值)
public class TimeDiaglog extends Dialog{
//时间
private View view;
private Button btn_cancle,btn_complete;
private DatePicker picker ;
private int y,m,d;
TextView tv_uptonow;
int year;
int month;
private Context context;
/**
* @param code
* */
public TimeDiaglog(Context context,int code,String hideOrshow,String resumeType) {
super(context);
// TODO Auto-generated constructor stub
view = this.getLayoutInflater().inflate(R.layout.popudatepicker, null);
view.setBackgroundColor(Color.WHITE);
picker = (DatePicker) view.findViewById(R.id.datePicker1);
//通过反射机制,访问private的mDaySpinner成员,并隐藏它
try {
Field daySpinner =picker.getClass().getDeclaredField("mDaySpinner");
daySpinner.setAccessible(true);
if(code==2){
Field monthSpinner =picker.getClass().getDeclaredField("mMonthSpinner");
monthSpinner.setAccessible(true);
}
((View)daySpinner.get(picker)).setVisibility(View.GONE);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
btn_cancle = (Button) view.findViewById(R.id.btn_cancle_date);
btn_complete = (Button) view.findViewById(R.id.btn_complete_date);
tv_uptonow = (TextView) view.findViewById(R.id.tv_uptonow);
if (hideOrshow.equals("start")) {
tv_uptonow.setVisibility(View.GONE);
}else{
if(resumeType.equals("E")){
tv_uptonow.setText("Present");
}
}
btn_cancle.setOnClickListener(dataClick);
btn_complete.setOnClickListener(dataClick);
tv_uptonow.setOnClickListener(dataClick);
//获取屏幕信息
Window window = getWindow();
this.setCanceledOnTouchOutside(false);
this.requestWindowFeature(window.FEATURE_NO_TITLE);
DisplayMetrics dm = new DisplayMetrics();
window.getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenHeigh = dm.heightPixels;
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,(int)(screenHeigh/2.3) );
this.setContentView(view,params);
this.show();
}
TimeLinstener linstener;
public void setValue(TimeLinstener linstener){
this.linstener = linstener;
}
android.view.View.OnClickListener dataClick = new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_cancle_date:
dismiss();
break;
case R.id.btn_complete_date:
y =picker.getYear();
m = picker.getMonth();
d = picker.getDayOfMonth();
setValue(linstener);
linstener onTimeListener(y, m, d,false);
dismiss();
break;
case R.id.tv_uptonow:
setValue(linstener);
dismiss();
break;
}
}
};
}
//Activity的调用(在Activity中回调接口,实现TimeListener)public class AddProjectperActivity extends ActionBarActivity implements TimeLinstener{
EditText edt_project_duty, edit_projectname, edit_companyname,
edit_dutyname, edt_project_history, edt_project_desc;
RelativeLayout relat_starttime, relat_end_Time;
TextView tv_content, tv_content2,mymoney_tial;// 开始时间,结束时间
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_projectper);
context = this;
showTimerDialog();
}
public void showTimerDialog(int code,String show){
TimeDiaglog diaglog = new TimeDiaglog(context, code, show,"C");
diaglog.setValue(this);
}
@Override
public voidonTimeListener(int year, int month, int day, boolean isclickit) {//获得接口暴露的时间值
// TODO Auto-generated method stub
if(isclickit){
tv_content2.setText("至今"); experience.setEndMonth(-1);experience.setEndYear(-1);
}else{
if (show.equals("start")) {
tv_content.setText(year + "-" + (month + 1));experience.setStartMonth((month + 1));experience.setStartYear(year);
} else {
tv_content2.setText(year + "-" + (month + 1));experience.setEndMonth((month + 1));experience.setEndYear(year);
}
}
};
}
大家,这是我总结的,有什么遗漏的希望能告诉我,让我完善下知识!!