开始CSDN体验之旅,督促一下自己!哼哼...
一般我们做地址选择框,或者自定义时间选择器时,都需要获取到选择的值,然后填充到编辑框里面,这样用户才知道自己选择了什么,同时也可能需要传递给后台。笔者认为可以有常用的三种方式:
1. Popuwindow - 全局变量就可以接收Popuwindow的返回值了;
2. Activity - 利用startActivityForResult进行该选择界面启动,同时利用onActivityResult接收返回值;
3. 还是Activity - 直接全局类,就是所谓的Constant.java类,利用全局变量的set/get方法来获取选择值;
题外:当然,Android传递信息肯定不止这样的一种方式,还有aidl之类的,我们这里的需求就是一个选择弹窗,所以不需要这些传递方式;你可能还会想,不是还有sharepreference吗? 再延伸下还有database.....我们又不是去开发什么登陆功能,登陆后需要记下用户信息或者去开发是否是首次启动这样的功能,所以不会去用这样的方式。
感慨:有时候做东西,光凭知识什么的或许还差点东西,更多需要实践和经验。
正儿八经:下面我们回到Activity这边来,之前我帮朋友一个忙,接了一个私活【利用周末时间弄的,公司事情实在忙不过来】:这个是一个政府项目,是一个提醒精灵,就是给社区用的,有医生提醒,患者家属提醒,巡查提醒等,类似移动助手,协助社区医生等更好的去为社区服务,说多了.....由于时间紧迫,同时大部分界面都是长得比较像的,所以我就直接复制,基本都是Activity做的,但是后面发现页面有改动,需要增加一些弹窗选择,同时弹窗选择里面还有弹窗选择。
其实最终只有一个目的就是为了获取“张三”这个人的属性id号,然后扔个后台就行。但是无奈后台数据不是那么优雅,同时我接到这个case的时候,没有需求,没有原型,我自己做了一个原型,然后给我哥们,我哥们又重新修改了一遍,然后开始做,然后做完了,发现又需要变动,又改,改呀改,最后又需要这样设计三个选择的方式,哎!我也是醉了,下次打死不接这样的项目。
页面基本都是Activity,所以来回跳转就可以了,这个利用startActivityForResult启动下一个页面,然后onActivityResult接收上一个页面的返回值,当第三个页面选择后,一层层把值传递给第一个页面就行了。
笔者单独做了一个demo,模拟了三个Activity的跳转,直接上代码,比较简单:
MainActivity.java
package me.example.activityjump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity
{
private static final String TAG = "me.example.activityjump.MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 跳转到第二个页面,接受第二个页面的返回值
* @param v
*/
public void goNextActivity(View v)
{
Intent intent = new Intent(MainActivity.this, NextActivity.class);
startActivityForResult(intent, 11);
}
/**
* 接受上一个页面的返回值
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
Log.e(TAG, "requestCode = " + requestCode);
switch (resultCode)
{
case 21:
Toast.makeText(this, data.getExtras().getString("from"), Toast.LENGTH_SHORT).show();
break;
case 22:
Toast.makeText(this, data.getExtras().getString("from"), Toast.LENGTH_SHORT).show();
default:
break;
}
}
}
NextActivity.java
package me.example.activityjump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;
public class NextActivity extends Activity
{
private static final String TAG = "me.example.activityjump.NextActivity";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
}
/**
* 从第二个页面跳转到第三个页面,或者直接返回第一个个页面+带返回值
* @param v
*/
public void goThirdActivity(View v)
{
///< 关闭自己,直接返回第一个页面
if (v.getId() == R.id.close)
{
setResult(21, new Intent().putExtra("from", "我来自第二个界面!"));
finish();
}
///< 跳转到第三个页面
else
{
Intent intent = new Intent(NextActivity.this, ThirdActivity.class);
startActivityForResult(intent, 22);
}
}
/**
* 接受第三个页面的返回值,并处理返回结果: 返回结果可能会要求直接继续跳转到第三个页面
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
Log.e(TAG, "requestCode = " + requestCode);
/**
* 利用resultCode进行分类处理
* @attention 如果是调用相机、相册等,需要用requestCode进行区分,而resultCode作为结果是否成功的判断;
* 这里我们的需求相对不同,可以不用那样做,这个倒没什么,看自己需要;
*/
switch (resultCode)
{
case 31:
Toast.makeText(this, data.getExtras().getString("is not from"), Toast.LENGTH_SHORT).show();
break;
case 32:
///< 继续往下传递参数
setResult(22, new Intent().putExtra("from", data.getExtras().getString("from")));
finish();
default:
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
return true;
}
return super.onKeyDown(keyCode, event);
}
}
ThirdActivity.java
package me.example.activityjump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
public class ThirdActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
}
/**
* 直接从第三个页面带返回值跳转到第二个页面
* @param v
*/
public void goSecondActivity(View v)
{
setResult(31, new Intent().putExtra("is not from", "我来自第三个页面!"));
finish();
}
/**
* 直接从第三个页面跳转到第一个页面
* @param v
*/
public void goMainActivity(View v)
{
setResult(32, new Intent().putExtra("from", "我来自第三个页面,我需要直接到第一个界面!"));
finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
return true;
}
return super.onKeyDown(keyCode, event);
}
}
其他的解释就不说了,直接看代码,顺便我附上工程下载地址... 【Activity】多个Activity带返回值跳转_startActivityForResult