问题描述
|
我有一个mainActivity是Customer.java,具有5个差异的listview。活动。当我点击它们时,我能够打开所有5个活动,但是当我按下后退按钮(设备后退按钮)返回到mainAcitivity时,会给我一个错误,您将在代码下方看到debug / logcat。我在主屏幕下有2个示例活动(注销和时钟输入)。
奖励:我想拥有的另一件事是,当单击“ clockinActivity”按钮时,我希望它将当前时间和日期发送到网络服务器(我的项目中已经有customhttp类)并自动返回到主屏幕。
我已经读过
http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html
而且这似乎不起作用
@Override
public boolean onKeyDown(int keyCode,KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
//do smth
}
return super.onKeyDown(keyCode,event);
}
客户.java
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class Customer extends ListActivity
{
TextView selection;
CustomerListItem[] items = {
new CustomerListItem(\"Start Trip\",StartTripActivity.class),new CustomerListItem(\"Clock in\",ClockinActivity.class),new CustomerListItem(\"Customer Svc\",CustomerSvcActivity.class),new CustomerListItem(\"Independent inspection\",inspectionActivity.class),new CustomerListItem(\"Pick Up\",PickUpActivity.class),new CustomerListItem(\"Log Out\",logoutActivity.class)};
private TextView resultsTxt;
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
setlistadapter(new ArrayAdapter<CustomerListItem>(
this,android.R.layout.simple_list_item_1,items));
selection = (TextView) findViewById(R.id.selection);
}
@Override
protected void onListItemClick(ListView l,View v,int position,long id)
{
super.onListItemClick(l,v,position,id);
final Intent intent = new Intent(this,items[position].getActivity());
startActivityForResult(intent,position);
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent intent)
{
super.onActivityResult(requestCode,resultCode,intent);
if (resultCode == RESULT_OK)
{
// Perform different actions based on from which activity is
// the application returning:
switch (requestCode)
{
case 0:
// Todo: handle the return of the StartTripActivity
break;
case 1:
// Todo: handle the return of the ClockinActivity
break;
case 2:
// Todo: handle the return of the CustomerSvcActivity
case 3:
// Todo: handle the return of the inspectionActivity
break;
case 4:
// Todo: handle the return of the PickUpActivity
break;
case 5:
// Todo: handle the return of the logoutActivity
break;
default:
break;
}
}
else if (resultCode == RESULT_CANCELED)
{
resultsTxt.setText(\"Canceled\");
}
}
}
ClockinActivity.java
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ClockinActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.clockin);
Thread myThread = null;
Runnable runnable = new CountDownRunner();
myThread= new Thread(runnable);
myThread.start();
}
public void doWork() {
runOnUiThread(new Runnable() {
public void run() {
try{
TextView txtCurrentTime= (TextView)findViewById(R.id.lbltime);
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String curTime = hours + \":\"+ minutes + \":\"+ seconds;
txtCurrentTime.setText(curTime);
}catch (Exception e) {
}
}
});
}
class CountDownRunner implements Runnable{
// @Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
try {
doWork();
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}catch(Exception e){
}
}
Button btn = (Button) findViewById(R.id.btn_OK);
//---event handler for the OK button---
btn.setonClickListener(new View.OnClickListener()
{
public void onClick(View view) {
Intent data = new Intent();
//---get the EditText view---
// EditText txt_username =
// (EditText) findViewById(R.id.txt_username);
//---set the data to pass back---
// data.setData(Uri.parse(
// txt_username.getText().toString()));
setResult(RESULT_OK,data);
//---closes the activity---
finish();
}
});
}
}
}
注销.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class logoutActivity extends Activity {
private Button btnlogout;
private Button btnCancel;
private TextView lblResult;
private EditText code;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logout);
code = (EditText)findViewById(R.id.codeout);
btnlogout = (Button) findViewById(R.id.submit);
btnCancel = (Button) findViewById(R.id.cancel);
lblResult = (TextView)findViewById(R.id.result);
btnlogout.setonClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// Todo Auto-generated method stub
String logout = code.getText().toString();
if (logout.equals(\"99999\")){
lblResult.setText(\"logout successful\");
Intent i = new Intent(getApplicationContext(),Login.class);
startActivity(i);
} else {
lblResult.setText(\"logout Failed\");
}
}
});
btnCancel.setonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(),Customer.class);
startActivity(i);
}
});
}}
LogCat
05-19 21:52:51.586:WARN / ActivityManager(58):启动超时已到期,放弃唤醒锁定!
05-19 21:52:51.586:WARN / ActivityManager(58):HistoryRecord {45108f08 com.merrill / .Customer}的活动空闲超时
05-19 21:52:56.799:WARN / ActivityManager(58):HistoryRecord {4510cf30 com.merrill / .Clockin}的活动销毁超时
除错
ActivityThread.deliverResults(ActivityThread $ ActivityRecord,List)行:3515
ActivityThread.handleSendResult(ActivityThread $ ResultData)行:3557
ActivityThread.access $ 2800(ActivityThread,ActivityThread $ ResultData)行:125
ActivityThread $ ResultData(ActivityThread $ H).handleMessage(Message)行:2063
ActivityThread $ H(Handler).dispatchMessage(Message)行:99
Looper.loop()行:123
ActivityThread.main(String [])行:4627
Method.invokeNative(Object,Object [],Class,Class [],Class,int,boolean)行:不可用[本机方法]
Method.invoke(Object,Object ...)第521行
ZygoteInit $ MethodAndArgsCaller.run()行:868
ZygoteInit.main(String [])行:626
NativeStart.main(String [])行:不可用[本机方法]
解决方法
我通过使用下面的代码找到了答案。我不得不将代码放置在onCreate之前,将我一直在将代码放置在onCreate之后的错误。除非其他人有更好的建议,否则这似乎对我有用。即使这两个代码都起作用,我还是喜欢第一个代码,因为它会杀死当前活动'finish()\'并返回到上一个屏幕,而第二个代码它将启动该活动并将两个活动都保留在堆栈中。
@Override
public boolean onKeyDown(int keyCode,KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Pop(\"Back Button\");
Intent intent = new Intent();
setResult(RESULT_OK,intent);
finish();
return true;
}
return super.onKeyDown(keyCode,event);
}
要么
@Override
public boolean onKeyDown(int keyCode,KeyEvent event)
{
//replaces the default \'Back\' button action
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//do whatever you want the \'Back\' button to do
//as an example the \'Back\' button is set to start a new Activity named \'NewActivity\'
this.startActivity(new Intent(thisActivity.this,nextActivity.class));
}
return true;
}