2011-05-19 64 views
0

我有一个mainActivity是Customer.java与5差异的列表视图。活动。当我点击它们时,我可以打开所有5个活动,但是当我按下按钮(设备后退按钮)返回到mainAcitivity时,它会给我一个错误,您将在代码下面看到debug/logcat。我在我的主屏幕(注销和时钟)下面发布了2个示例活动。Android:使用后退按钮主要活动给错误强制关闭

Bonus:作为一个额外的东西,我想要的是,当点击'clockinActivity'按钮,我希望它发送当前时间&日期到web服务器(我已经在我的项目中有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); 
} 

Customer.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(); 
    } 
}); 
} 
} 
} 

Logout.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,列表)线:3515
ActivityThread.handleSendResult(ActivityThread $ ResultData)线:3557
ActivityThread .access $ 2800(ActivityThread,ActivityThread $ ResultData)行:125 ActivityThread $ ResultData(ActivityThread $ H).handleMessage(Message)行:2063
ActivityThread $ H(处理程序).dispatchMessage(消息)线:99 Looper.loop()线:123 ActivityThread.main(字符串[])线:4627
Method.invokeNative(对象,对象[ ZygoteInit $ MethodAndArgsCaller.run()行:868行:不可用[本机方法]

ZygoteInit.main(字符串[])线:626 NativeStart.main(字符串[])行:不可用[本机方法]

回答

0

我通过使用下面的代码找到了答案。我必须在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; 
    }