Android: использование кнопки «Назад» в основной активности приводит к принудительному закрытию ошибки - PullRequest
0 голосов
/ 20 мая 2011

У меня есть mainActivity - Customer.java со списком 5 различий.деятельность.Мне удалось открыть все 5 действий, когда я нажимаю на них, но когда я нажимаю кнопку «назад» (кнопка устройства), чтобы вернуться к основной активности, это выдаст мне ошибку, которую вы увидите в кодах отладки / 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-story.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, List) строка: 3515
ActivityThread.handleSendResult (ActivityThread $ ResultData) строка: 3557
ActivityThread.access $ 2800 (ActivityThread, ActivityThread $ ResultData) строка: 125 ActivityThread $ ResultData (ActivityThread $ H) .handleMessage (Сообщение) строка: 2063
ActivityThread $ H (Обработчик) .dispatchMessage (Сообщение) строка: 99Looper.loop () строка: 123 ActivityThread.main (String []) строка: 4627
Method.invokeNative (Object, Object [], Class, Class [], Class, int, boolean) строка: не доступно [собственныйmethod]
Method.invoke (Object, Object ...) строка: 521
ZygoteInit $ MethodAndArgsCaller.run () строка: 868
ZygoteInit.main (String []) строка: 626 NativeStart.main (String []) строка: недоступно [собственный метод]

1 Ответ

0 голосов
/ 20 мая 2011

Я нашел ответ, используя код ниже.Я должен был поместить этот код перед 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;  
    }  
...