2016-05-14 20 views
1

Ganz oben möchte ich etwas verdeutlichen: Der Button, mit dem ich mich abmühe, ist NICHT der back Button. Ich beziehe mich auf die Schaltfläche up/home in der ActionBar/Toolbar am oberen Rand der App, nicht die Android-Schaltfläche am unteren Rand. Es gibt ein paar posts von ähnlicher Natur, aber sie adressieren die Zurück-Taste, nicht die Hoch-Taste.Up Button ruft OnDestroy der Elternaktivität auf

Hier ist die Situation: Ich habe eine Aktivität A, die ein ListView-Fragment hat. Wenn der Benutzer auf ein Listenansichtselement klickt, wird Aktivität B gestartet. Pretty typical. Aktivität A hat ein EditText Feld in der Symbolleiste, mit dem der Benutzer einen Suchparameter eingeben kann. Wenn der Benutzer die Schaltfläche up/home von Aktivität B erreicht, werde ich erfolgreich zu Aktivität A zurückkehren. Allerdings möchte ich, dass in Aktivität A derselbe Text im Feld EditText angezeigt wird, das dort war, als sie es verlassen haben. Wenn der Benutzer die Schaltfläche back drückt, wird dieser Text wiederhergestellt. Wenn sie jedoch mit der Schaltfläche up/home navigieren, ist das Feld EditText leer.

verwendet einige Log-Anweisungen, das kann ich sehen, wenn ein Listenelement aus Aktivität A abgegriffen wird, onSaveInstanceState und onStop beide genannt (aber onDestroy an dieser Stelle nicht genannt wird.) Aus Aktivität B, wenn die up/home Taste abgegriffen , onDestroy von Aktivität A ist sofort genannt, gefolgt von onCreate, etc. Allerdings ist das Bündel savedInstanceState Null, vermutlich seit onDestroy wurde gerade aufgerufen.

Warum wird onDestroy bei der Rückkehr zu Aktivität A aufgerufen? Das ergibt für mich keinen Sinn. Hier ist, was ich im Manifest habe:

<activity 
    android:name=".Activity.ActivityA" 
    android:label="@string/app_name" 
    android:parentActivityName=".Activity.ParentActivity" 
    android:theme="@style/AppTheme" 
    android:launchMode="singleTop" 
    android:windowSoftInputMode="stateVisible" /> 

<activity 
    android:name=".Activity.ActivityB" 
    android:label="@string/app_name" 
    android:parentActivityName=".Activity.ActivityA" 
    android:theme="@style/AppTheme" /> 

Hier sind die entsprechenden Methoden in A Aktivität:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     actionBar = getSupportActionBar(); 

     if (actionBar != null) 
      initializeActionBar(); 

     if (getSupportActionBar() != null) 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     Log.d(TAG, "on create"); 

     if (savedInstanceState != null) { 
      Log.d(TAG, "saved instance state not null"); 
      if (savedInstanceState.getString("search_text") != null) 
       etSearch.setText(savedInstanceState.getString("search_text")); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("search_text", etSearch.getText().toString()); 
     Log.d(TAG, "on Save instance state"); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     Log.d(TAG, "on restore instance state"); 

     if (savedInstanceState != null) { 
      if (savedInstanceState.getString("search_text") != null) 
       etSearch.setText(savedInstanceState.getString("search_text")); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d(TAG, "on resume"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d(TAG, "on stop"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "on destroy"); 
    } 

private void initializeActionBar() { 

    actionBar.setCustomView(R.layout.actionbar_with_edittext); 

    etSearch = (EditText) actionBar.getCustomView().findViewById(R.id.actionbar_searchfield); 
    etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { 

     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

      if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { 
       initiateNewSearch(); 
       etSearch.clearFocus(); 

      } 

      return false; 
     } 
    }); 

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.showSoftInput(etSearch, InputMethodManager.SHOW_IMPLICIT); 
    etSearch.requestFocus(); 
} 

Ich glaube nicht, dass irgendeine der Code in Aktion B hier relevant ist.

Dies ist meine Konsole ausgegeben, wenn ein Benutzer auf einem Listview-Elemente tippt in A Aktivität:

auf Speicher Instanz Zustand
auf Anschlag

Und dann ist es das, was der Benutzer erzeugt wird, wenn Armaturen auf der up/home Taste von Aktivität B:

zerstören auf
auf
auf resum erstellen e

Wenn es noch etwas gibt, das Ihnen helfen kann, lassen Sie es mich wissen. Danke für jeden Hinweis!

+1

Hallo Alex, kannst du bitte den Code für deine onOptionsAtemSelected einbinden? Ich frage mich, ob Sie nicht versuchen sollten, die "Navigation nach oben" ('android.R.id.nach Hause ") mit etwas wie" NavUtils ". – ishmaelMakitla

Antwort

4

Ich weiß nicht, warum Vorgegeben Schaltfläche Implementierung eine neue Aktivität erzeugt, sondern eine funktionierende Lösung für mich ist onOptionsItemSelected außer Kraft zu setzen:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if(id== android.R.id.home){ 
     onBackPressed(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Auch diese Lösung funktioniert für mich:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       Intent intent = NavUtils.getParentActivityIntent(this); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
         | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       NavUtils.navigateUpTo(this, intent); 
       return true; 
      default: 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
+0

Große Lösung. Vielen Dank! – Alex

Verwandte Themen