1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Activity richtig beenden

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Butch78, 12.06.2012.

  1. Butch78, 12.06.2012 #1
    Butch78

    Butch78 Threadstarter Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    06.12.2011
    Hi zusammen,

    ich habe ein kleines Problem beim Beenden meiner Activity.
    Dies mache ich derzeit so:

    Code:
    @Override
     protected void onResume() {
      // TODO Auto-generated method stub
      
      if(updateIsRequired){
       refreshCalendar();
      }
      super.onResume();
      
     }
    
     public void onButtonClick(View v){
      final Intent intent = new Intent();
      intent.putParcelableArrayListExtra ("resultlist", (ArrayList<? extends Parcelable>) m_driverlist); 
      intent.putExtra("planid", mPlanID);
      if (getParent() == null) {
          setResult(Activity.RESULT_OK, intent);
      } else {
          getParent().setResult(Activity.RESULT_OK, intent);
      }
      updateIsRequired = false;
      finish();
     
     }
    
    Wenn ich auf meinen Beenden-Button klicke sollen verschiedene Werte als Ergebnis zurückgegeben werden. Mein Problem ist, dass finish() immer die onResume Methode aufruft und diese dort dann mit der Methode refreshCalendar() wieder meine alten Werte herstellt. Dann habe ich versucht mittels der globalen Variable "updateIsRequired" dies zu verhindern. Diese setze ich auch auf false, aber in der onResume-Methode steht diese dann wieder auf "true" und refreshCalendar() wird wieder durchlaufen...

    Hab schon viel gesucht, gelesen und ausprobiert aber auf den Fehler bin ich bisher leider noch nicht gekommen :(

    Hoffe ihr könnt mir helfen..

    Grüße

    Butch
     
  2. swordi, 12.06.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    finish ruft immer onresume auf ? meinst du in der gleichen activity ? oder sind das code ausschnitte von 2. verschiedenen activities ?
     
  3. Butch78, 12.06.2012 #3
    Butch78

    Butch78 Threadstarter Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    06.12.2011
    Hi,

    ja das geschieht in der gleichen activity. Evtl. liegt ja das Problem darin, dass ich in meiner Activity eine weitere Activity mit
    startActivityForResult aufrufe?

    Zur Vollständigkeit hier meine komplette Actvity.

    Code:
    [LEFT] public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.calendar);
         mContext = this;
         extras = getIntent().getExtras();
              
         month = Calendar.getInstance();
         m_driverlist = (ArrayList<Driver>) extras.get("driverlist"); 
         
         adapter = new CalendarPlanAdapter(this, month);
         items = new ArrayList<CalendearItem>();
         mPlanID = extras.getInt("planid");
         
         GridView gridview = (GridView) findViewById(R.id.gridview);
         gridview.setAdapter(adapter);
         
         handler = new Handler();
         handler.post(calendarUpdater);
         
         TextView title  = (TextView) findViewById(R.id.title);
         title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
         
         TextView previous  = (TextView) findViewById(R.id.previous);
         previous.setOnClickListener(new OnClickListener() {
       
       @Override
       public void onClick(View v) {
        if(month.get(Calendar.MONTH)== month.getActualMinimum(Calendar.MONTH)) {    
         month.set((month.get(Calendar.YEAR)-1),month.getActualMaximum(Calendar.MONTH),1);
        } else {
         month.set(Calendar.MONTH,month.get(Calendar.MONTH)-1);
        }
        refreshCalendar();
       }
      });
         
         TextView next  = (TextView) findViewById(R.id.next);
         next.setOnClickListener(new OnClickListener() {
       
       @Override
       public void onClick(View v) {
        if(month.get(Calendar.MONTH)== month.getActualMaximum(Calendar.MONTH)) {    
         month.set((month.get(Calendar.YEAR)+1),month.getActualMinimum(Calendar.MONTH),1);
        } else {
         month.set(Calendar.MONTH,month.get(Calendar.MONTH)+1);
        }
        refreshCalendar();
        
       }
      });
         
      gridview.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
           TextView date = (TextView)v.findViewById(R.id.date);
              String day = date.getText().toString();
           CalendearItem item = (CalendearItem) parent.getItemAtPosition(Integer.valueOf(day));       
              if(day.length()<2){
               day = "0" + day;
              }
           if(date instanceof TextView && !date.getText().equals("")) {
               if(item !=null){
                ArrayList<Driver> driverlist = new ArrayList<Driver>();
                driverlist.add(item.getDriver());
          Intent intent = new Intent(mContext, ChangeDrive.class); 
                intent.putParcelableArrayListExtra ("alldriverlist", (ArrayList<? extends Parcelable>) m_driverlist);   
                intent.putParcelableArrayListExtra ("driverlist", (ArrayList<? extends Parcelable>) driverlist);   
                intent.putExtra("date", android.text.format.DateFormat.format(item.getDay() + "." + "MM.yyyy", month));
                intent.putExtra("planid", mPlanID);
          startActivityForResult(intent, CHANGE_DRIVER_REQUEST);
               }else{
          Intent intent = new Intent(mContext, ChangeDrive.class); 
                intent.putParcelableArrayListExtra ("alldriverlist", (ArrayList<? extends Parcelable>) m_driverlist);   
                intent.putExtra("date", android.text.format.DateFormat.format(day + "." + "MM.yyyy", month));
                intent.putExtra("planid", mPlanID);
          startActivityForResult(intent, CHANGE_DRIVER_REQUEST);
               }                        
              }
         
          }
      });
     }
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      
      if (requestCode == CHANGE_DRIVER_REQUEST) {
                if (resultCode == RESULT_OK) {          
                   extras = data.getExtras();  
                   m_driverlist.clear();         
                   m_driverlist = (ArrayList<Driver>) extras.get("list");   
                   //finish();
              }
      }  
     }
     private void setItems() {
      Iterator it = m_driverlist.iterator();
      while(it.hasNext()){
       int i = 0;
       Driver dr = (Driver) it.next();
       Iterator at = dr.getDrivingDates().iterator();
       while(at.hasNext()){
        String date = (String) at.next();     
        String[] dateArray = date.split("-");
        
        String day = dateArray[2];
        String rmonth = dateArray[1];
        String cmonth = String.valueOf(month.get(Calendar.MONTH)+1);
        if(cmonth.length()==1){
         cmonth = "0" + cmonth;
        }
        int year= new Integer(dateArray[0]);
        int cyear = month.get(Calendar.YEAR);
      
        if(rmonth.equals(cmonth) && year == cyear){
         CalendearItem calitem = new CalendearItem(day, dr);
         items.add(calitem);
        }
       } 
       i++;
      }
     }
     public void refreshCalendar()
     {
       TextView title  = (TextView) findViewById(R.id.title);  
       adapter.refreshDays();
       adapter.notifyDataSetChanged();      
       handler.post(calendarUpdater); // generate some random calendar items      
       title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
     }
     
     private void test(){
      items.clear();
      setItems(); 
      adapter.setItems(items);
      adapter.notifyDataSetChanged(); 
     }
    
     public Runnable calendarUpdater = new Runnable() {
      @Override
      public void run() {
       items.clear();
       setItems(); 
       adapter.setItems(items);
       adapter.notifyDataSetChanged();  
      }   
     };
    
     @Override
     protected void onResume() {
      // TODO Auto-generated method stub
      
      if(updateIsRequired){
       refreshCalendar();
      }
      super.onResume();
      
     }
    
     public void onButtonClick(View v){
      final Intent intent = new Intent();
      intent.putParcelableArrayListExtra ("resultlist", (ArrayList<? extends Parcelable>) m_driverlist); 
      intent.putExtra("planid", mPlanID);
      if (getParent() == null) {
          setResult(Activity.RESULT_OK, intent);
      } else {
          getParent().setResult(Activity.RESULT_OK, intent);
      }
      updateIsRequired = false;
      finish();
     
     }
     
     @Override
     protected void onDestroy() {
      super.onDestroy();
      finish();
     }
    }
     
    
    Gruß[/LEFT]
     
  4. Tom299, 12.06.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich hatte mal ein ähnliches Problem. Hatte im onKeyDown den Back-Button abgefragt, allerdings wurden da noch Checks usw. durchgeführt und evtl. mußte man noch einen Dialog bestätigen. Beim finish() wurde dann die aktuelle Activity beendet, aber gleichzeitig wieder eine neue erstellt (onCreate). Wieso weshalb warum hab ich nie rausgefunden, hab meine Logik dann komplett umschreiben müssen ...
     
  5. Butch78, 12.06.2012 #5
    Butch78

    Butch78 Threadstarter Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    06.12.2011
    habs gerade mal überprüft, bei finish() wird anschließend tatsächlich wieder onCreate durchlaufen... Aber warum nur?

    Gruß
     
  6. Tom299, 12.06.2012 #6
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    also hast du den gleichen Effekt wie ich damals ... und ich hatte keine Lösung gefunden ... ich hatte auch in der manifest mal rumgespielt und die verschiedenen launchMode's ausprobiert, hat aber alles nichts gebracht ... falls du ne Lösung findest, her damit ;-)
     
  7. Butch78, 12.06.2012 #7
    Butch78

    Butch78 Threadstarter Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    06.12.2011
    ok ich werds versuchen. Wie konntest du damals dein Problem umgehen?
     
  8. Tom299, 12.06.2012 #8
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    ich hab finish() nicht mehr genutzt, sondern die logik so umgestrickt, daß ich mit dem back-button aus der activity raus bin, die wurde dann automatisch beendet.
     
  9. Butch78, 12.06.2012 #9
    Butch78

    Butch78 Threadstarter Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    06.12.2011
    das hier hatte ich auch schon versucht:

    Code:
    @Override
        public void onBackPressed() {
                super.onBackPressed();
                this.finish();
        }
    
    Aber auch ohne Erfolg... Hast du noch die Methode zur Hand ?
     
  10. Tom299, 12.06.2012 #10
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    z.B. :
    Code:
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {			
    			if (doSomething()) {
                               return true;
                            }
                            else {
    			   return false;
                            }
    		}
    		
    		return super.onKeyDown(keyCode, event);
    	}
    
     

Diese Seite empfehlen