您的位置:首页 > 移动开发 > Android开发

android startActivityForResult实现Acitvity的回调

2012-07-31 18:01 701 查看
我们来看一个示例图:

     

        

         


        首先我们看到一篇很有吸引力的文章时候都会忍不住去评论,可是在我们评论时候,会突然蹦到登录页面,才发现我们根本就没有登录,这也是现在大部分应用的结构吧,目的是先吸引住你,然后你会不自觉的想注册登录,反过来如果应用首先就登录,会觉得比较繁琐,心情不好,直接就drop了。我个人认为啊.不多说了,看下面实现.

       我们这里主要用到的方法:

       跳转:startActivityForResult(new Intent(this, LoginActivity.class), 1);

       在LoginActivity中要执行setResult(RESULT_OK);  finish(); 记住finish不可缺省的.不然回调后的页面会在LoginActivity这个页面下面,这肯定不是我们要的效果.原因简单,我不多说了.

       最后我们要在本Activity回调:

/***
* requestCode 这个参数和上面startActivityForResult里面的requestCode是一一对应的.
* requestCode这个参数主要是用在同一个activity当中
* ,如果有好几处调用startActivityForResult,这时为了区分回调是谁执行的,就用requestCode来区分,
* 而由哪个activity返回的我们只需要resultCode就可以了.
* 所以onActivityResult里面的resultCode是setResult(RESULT_OK)和这里面的参数一致的.

        *  data用于传些数据或过滤.这里么有用到
*/

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

         

代码片段:

public class OneActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Session.username == null || Session.password == null
|| !Session.username.trim().equals("123")
||! Session.password.trim().equals("123")) {
startActivityForResult(new Intent(this, LoginActivity.class), 1);
return;
}
TextView textView = new TextView(this);
textView.setText("OneActivity...");
setContentView(textView);

}

/***
* requestCode 这个参数和上面startActivityForResult里面的requestCode是一一对应的.
* requestCode这个参数主要是用在在同一个activity当中
* ,有好几处调用startActivityForResult,这时为了区分谁执行的,就用requestCode来区分,
* 而由哪个activity返回的我们只需要resultCode就可以了.
* 所以onActivityResult里面的resultCode是setResult(RESULT_OK)和这里面的参数一致的.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.username != null && Session.password != null
&& Session.username.trim().equals("123")
&& Session.password.trim().equals("123")) {
Intent intent = new Intent(OneActivity.this, OneActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
finish();

}

}
这里需要说明一下:

这里我们需要在回调后执行这个activity的oncrate方法,可是我直接调用oncreate方法,没有反应,一气之下就这样搞了,效率不高,如果有好的解决方案给俺说一下,共同进步嘛.

下面是loginActivity.java代码片段:

findViewById(R.id.bt_login).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String username = ((EditText) findViewById(R.id.et_username))
.getText().toString();
String password = ((EditText) findViewById(R.id.et_password))
.getText().toString();
if (!username.equals("123") && !password.equals("123")) {
Toast.makeText(LoginActivity.this, "用户名密码错误", 1000).show();
((EditText) findViewById(R.id.et_username)).setText("");
((EditText) findViewById(R.id.et_password)).setText("");
return;
}
// 模拟保存数据
Session.username = username;
Session.password = password;
setResult(RESULT_OK);
finish();
}
});
这样就实现效果了。其实很简单很简单吧,主要是实现这个效果的思路,其实还有很多,有隐试Intent什么实现不了,哈哈.

效果如下:


    

   

 
 


我还讲解一下吧:

         首先你点击oneActivity,TwoActivity,ThreeActivity她们会直接跳转至登录页面,因为你首次登录且没有登录.

         在你点击TwoActivity后会跳转至登录页面,你输入好用户名密码,点击登录,这个时候会跳转至TwoActivity页面,相应的你点击ThreeActivity她会调转只ThreeActivity页面。做的非常丑陋,不过实现我期望的效果了,其实很简单,我想你早就OK了.

       
bug修改:

        上面有个bug,如果在登录界面,你点击返回键就知道,其实我们应该监听登录的返回键的。下面是处理:

        只是个方案,我们还可以根据需求进行调整,就说这么多了,如有好的建议,请给透漏给我一下.@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
return super.onKeyDown(keyCode, event);
}
     
源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐