实验3:Android组件通信

来源:互联网 发布:傲剑绿色版升级数据 编辑:程序博客网 时间:2024/06/01 13:49

编程实现:

(1)功能描述:

  • 主界面上有一个“登录”按钮,点击“登录”按钮后打开一个新的Activity
  • 新的Activity上面有输入用户名和密码的控件,在用户关闭这个Activity后,将用户输入的用户名和密码传递到主界面中

(2)编程要点:

  • 主界面的Activity命名为MainActivity;启动新的Activity命名为UserLoginActivity
  • 分别使用显式启动和隐式启动的方式,启动新的Activity
  • 用户名中不能出现“@”等符号,同时长度不超过12个字符;密码使用密码文本显示方式,即显示为“******”方式,同时只能为数字*
  • 返回的用户名和密码要以Toast的方式显示出来
  • MainActivity和UserLoginActivity中各个生命周期的回调函数中要以Log.i方式显示日志信息

代码片:

MainActivity.java

package com.example.experiment3_4_1;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity{    public static final String TAG="MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        Log.d(TAG,"onCreate");        setContentView(R.layout.activity_main);        Button button01=(Button)findViewById(R.id.button01);        Button button02=(Button)findViewById(R.id.button02);        button01.setOnClickListener(new OnClickListener(){            @Override            public void onClick(View v){                //显式启动                Intent intent01=new Intent(MainActivity.this,UserLoginActivity.class);                startActivityForResult(intent01,1);            }        });        button02.setOnClickListener(new OnClickListener(){            @Override            public void onClick(View v){                //隐式启动                Intent intent02=new Intent("com.example.activitytest.ACTION_START");                startActivityForResult(intent02,1);            }        });    }    protected void onActivityResult(int requestCode,int resultCode,Intent data){        switch(requestCode){        case 1:            if(resultCode==RESULT_OK){                String returnedData=data.getStringExtra("data_return");                Toast.makeText(getApplicationContext(),returnedData.toString(),                        Toast.LENGTH_LONG).show();            }            break;        default:        }        /*        super.onActivityResult(requestCode,resultCode,data);        if(resultCode==RESULT_OK){            Uri uriData=data.getData();            Toast.makeText(getApplicationContext(),uriData.toString(),                    Toast.LENGTH_LONG).show();        }        else{            Toast.makeText(getApplicationContext(),"用户名和密码为空",                    Toast.LENGTH_LONG).show();        }        */    }    @Override    protected void onStart(){        super.onStart();        Log.i(TAG,"onStart");    }    @Override    protected void onResume(){        super.onResume();        Log.i(TAG,"onResume");    }    @Override    protected void onPause(){        super.onPause();        Log.i(TAG,"onPause");    }    @Override    protected void onStop(){        super.onStop();        Log.i(TAG,"onStop");    }    @Override    protected void onDestroy(){        super.onDestroy();        Log.i(TAG,"onDestroy");    }    @Override    protected void onRestart(){        super.onRestart();        Log.i(TAG,"onRestart");    }    @Override    public boolean onCreateOptionsMenu(Menu menu){        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main,menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item){        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id=item.getItemId();        if(id==R.id.action_settings){            return true;        }        return super.onOptionsItemSelected(item);    }}

UserLoginActivity.java

package com.example.experiment3_4_1;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.InputFilter;import android.text.Spanned;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class UserLoginActivity extends Activity {    public static final String TAG="MainActivity";    EditText editText1;    EditText editText2;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        Log.d(TAG,"onCreate");        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.userlogin);        editText1=(EditText)findViewById(R.id.username);        setEditTextInhibitInputSpecialChat(editText1);        editText2=(EditText)findViewById(R.id.password);        }    @Override    public void onBackPressed(){        String username=editText1.getText().toString();        String password=editText2.getText().toString();        String uriString="用户名:"+username+"\n"+"密码:"+password;        Intent intent=new Intent();        intent.putExtra("data_return",uriString);        //Uri data=Uri.parse(uriString);        //Intent intent=new Intent(null,data);        if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){            Toast.makeText(getApplicationContext(),"用户名和密码为空",                    Toast.LENGTH_LONG).show();            finish();        }        else{            setResult(RESULT_OK,intent);            finish();        }       }    public static void setEditTextInhibitInputSpecialChat(EditText editText){        InputFilter filter=new InputFilter() {            @Override            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {                String specialChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";                Pattern pattern = Pattern.compile(specialChat);                Matcher matcher = pattern.matcher(source.toString());                if(matcher.find()||source.equals(" ")||dend>11)                    return "";                else                     return null;            }        };        editText.setFilters(new InputFilter[]{filter});    }    @Override    protected void onStart(){        super.onStart();        Log.i(TAG,"onStart");    }    @Override    protected void onResume(){        super.onResume();        Log.i(TAG,"onResume");    }    @Override    protected void onPause(){        super.onPause();        Log.i(TAG,"onPause");    }    @Override    protected void onStop(){        super.onStop();        Log.i(TAG,"onStop");    }    @Override    protected void onDestroy(){        super.onDestroy();        Log.i(TAG,"onDestroy");    }    @Override    protected void onRestart(){        super.onRestart();        Log.i(TAG,"onRestart");    }}

代码分析:

  • 因为题目要求返回数据给上一个活动,所以采用startActivityForResult()的方法启动活动。startActivty()方法接受两个参数,第一个参数是Intent,第二个参数是请求码。例如:这里的请求码只要是一个唯一值就可以,这里传入了1。
startActivityForResult(intent01,1);
  • 因为是使用startActivityForResult()方法来启动UserLoginActivity的,在UserLoginActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以需要在MainActivity中重写这个方法来得到返回的数据。
protected void onActivityResult(int requestCode,int resultCode,Intent data){        switch(requestCode){        case 1:            if(resultCode==RESULT_OK){                String returnedData=data.getStringExtra("data_return");                Toast.makeText(getApplicationContext(),returnedData.toString(),                        Toast.LENGTH_LONG).show();            }            break;        default:        }    }
  • 在UserLoginActivity中注册点击事件,并在点击事件中添加返回数据的逻辑。我们先是构建了一个Intent,紧接着把要传递的数据存放在Intent中,然后调用了setResult()方法。这个方法专门用于向上一个活动返回数据。setResult()方法接受两个参数,第一个参数用于向上一个活动返回处理结果,一般只用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去,然后再调用finish()方法销毁当前活动。
  • 因为题目没有说明如何关闭UserLoginActivity,因此我选择采用Android自带的返回键来退出,即通过Back键回到MainActivity。所以需要重写onBackPressed()方法。
@Override    public void onBackPressed(){        String username=editText1.getText().toString();        String password=editText2.getText().toString();        String uriString="用户名:"+username+"\n"+"密码:"+password;        Intent intent=new Intent();        intent.putExtra("data_return",uriString);        //Uri data=Uri.parse(uriString);        //Intent intent=new Intent(null,data);        if((username==null||username.length()<=0)&&(password==null||password.length()<=0)){            Toast.makeText(getApplicationContext(),"用户名和密码为空",                    Toast.LENGTH_LONG).show();            finish();        }        else{            setResult(RESULT_OK,intent);            finish();        }       }
  • 因为题目要求用户名中不能出现特殊符号,同时长度不超过12字符。这时我们可以使用系统提供的输入过滤器InputFilter来过滤特殊字符。而在做长度限制时最简单的方法就是在EditText中设置maxLength属性。但是maxLength和InputFilter会起冲突。InputFilter()方法中dend参数即对长度进行限制。因此我们让dend>11,就成功限制输入长度为12个字符。注意:end是限制每次输入长度的,而dend是限制总的输入长度的。
public static void setEditTextInhibitInputSpecialChat(EditText editText){        InputFilter filter=new InputFilter() {            @Override            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {                String specialChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";                Pattern pattern = Pattern.compile(specialChat);                Matcher matcher = pattern.matcher(source.toString());                if(matcher.find()||source.equals(" ")||dend>11)                    return "";                else                     return null;            }        };        editText.setFilters(new InputFilter[]{filter});    }
  • Toast的用法是通过静态方法makeText()创建出一个Toast对象,然后调用show()方法将Toast显示出来。makeText()方法需要传入三个参数。第一个参数是Context,第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
Toast.makeText(getApplicationContext(),returnedData.toString(),Toast.LENGTH_LONG).show();

运行图片:

登录界面

输入界面

显示界面

原创粉丝点击