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

Android Api Demos登顶之路(十七)Redirection

2015-08-03 19:46 363 查看
这个demo演示的是从另外一个activity中获取用户输入的信息。

基本实现思路是:1.在子activity中用户输入信息时,将用户输入的信息保存到sharepreference中, sharepreference的用法我们在前面的章节中已经介绍过。实现数据的持久化,并可以在当前应用中的 各个activity之间共享这些信息。

2.进入信息显示的主界面时首先获取sharepreference中的内容,如果内容不为空则将内容显示到主界面上, 如果内容为空,则开启用户输入界面,让用户输入信息。

3.当用户输入完毕并保存到sharepreference中后,再调从sharepreference中加载数据的方法,将信息 显示到当前的主界面上。

本例中使用了startactivityforresult()方法来开启子activity,主要是利用返回的结果码来决定主界面的显示状态。事实上数据已经在sharepreference中持久化,使用startActivity()方法开启 子activity也同样可以实现此功能。不过可以在本例中体会一下请求码的用法。

主布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/info_main" />
<Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="Go"/>

</LinearLayout>


显示用户信息的主界面布局文件:redirect_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp" >

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="You now see the main activity running normally because the user text has been set to:"/>

<TextView
android:id="@+id/tv_user_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<Button
android:id="@+id/bt_clean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="Clean and Exit"/>
<Button
android:id="@+id/bt_new_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="New Text"/>
</LinearLayout>


用户输入界面的布局文件redirect_getter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Enter the text that will be used by main activity.Press back to cancel."/>
<EditText
android:id="@+id/et_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"/>
<Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="Apply"/>

</LinearLayout>


MainActivity

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void click(View v){
Intent intent=new Intent(this, RedirectMain.class);
startActivity(intent);
}
}


RedirectMain

public class RedirectMain extends Activity implements OnClickListener {
private static final int INIT_TEXT_CODE = 0;
private static final int NEW_TEXT_CODE = 1;

private String mText;
private TextView tv_user_input;
private Button bt_clean, bt_new;
private SharedPreferences sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.redirect_main);
sp=getSharedPreferences("redirection", Context.MODE_PRIVATE);
tv_user_input = (TextView) findViewById(R.id.tv_user_input);
bt_clean = (Button) findViewById(R.id.bt_clean);
bt_new = (Button) findViewById(R.id.bt_new_text);
bt_clean.setOnClickListener(this);
bt_new.setOnClickListener(this);

//首先在sharepreference中检索是否有保存的内容,如果内容为空则开启子activity
//让用户输入信息
if(!loadPreserce()){
Intent intent=new Intent(this, RedirectGetter.class);
startActivityForResult(intent, INIT_TEXT_CODE);
}
}

/**
* 检索SharedPreferences中保存的内容如果为空返回false否则将内容显示在textview上
* 并返回true
* @return
*/
private boolean loadPreserce() {
mText=sp.getString("text", null);
if(mText!=null && mText!=""){
tv_user_input.setText(mText);
return true;
}
return false;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==INIT_TEXT_CODE){
//如果在SharedPreferences内容为空且用户取消了信息输入的请求则结束当前的activity
//即退出到MainActivity当中
if(resultCode==RESULT_CANCELED){
finish();
}else{
loadPreserce();
}
}
if(requestCode==NEW_TEXT_CODE){
/*
* 如果当前的请求码为NEW_TEXT_CODE说明textView中显示了SharedPreferences中
* 保存的用户信息,此时如果结果码为RESULT_CANCELED只是说明用户没有修改textViewk
* 中的内容,仍需保留在当前界面,所以我们不需要关心这种情况。
*/
if(resultCode==RESULT_OK){
loadPreserce();
}
}
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_clean:
celanAndExit();
break;
case R.id.bt_new_text:
newText();
break;
default:
break;
}
}

/**
* 打开用户输入的activity让用户重新输入信息
*/
private void newText() {
Intent intent=new Intent(this, RedirectGetter.class);
startActivityForResult(intent, NEW_TEXT_CODE);
}

/**
* 清除sharepreference中的内容并退出当前的activity
*/
private void celanAndExit() {
sp.edit().remove("text").commit();
finish();
}
}


RedirectGetter

/**
* 用户输入信息的子界面
*
* @author aaaa
*
*/
public class RedirectGetter extends Activity {
private EditText et_input;
private SharedPreferences sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.redirect_getter);
sp = getSharedPreferences("redirection",
Context.MODE_PRIVATE);
et_input = (EditText) findViewById(R.id.et_input);
//如果sharepreference中有数据则载入数据并回显到editView当中
loadPreference();
}

private void loadPreference() {
String mTextPre=sp.getString("text", null);
if(mTextPre!=null){
et_input.setText(mTextPre);
}else{
et_input.setText("");
}
}

/**
* 点击按钮时将数据保存到sharepreference当中
*
* @param v
*/
public void click(View v) {
SharedPreferences.Editor editor=sp.edit();
editor.putString("text", et_input.getText().toString());
if(editor.commit()){
//如果数据被正确保存,则设置结果码为请求成功
setResult(RESULT_OK);
}

finish();
}
}


当然最后提醒一下在配置文件中注册activity
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: