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!
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