2017-07-01 42 views
0

我已經使用PreferenceFragment實現了我的應用程序的設置屏幕。 當點擊設置屏幕工具欄中的向上按鈕時,我的應用程序將返回到MainActivity屏幕,但之前輸入到EditTexts中的數據(在進入設置屏幕之前)將丟失,並且EditTexts全部爲空。從PreferenceFragment返回MainActivity時恢復EditText

我試着實現onSaveInstanceState和onRestoreInstanceState,但它不工作,因爲onRestoreInstanceState在單擊設置屏幕工具欄中的向上按鈕時未被調用。 savedInstanceState在onCreate中也爲null。

如果有人可以指出如何恢復EditTexts中的數據,那麼會真的很感激嗎? :)

這裏的日誌MainActivity:

點擊從工具欄菜單設置:

I/LOG:在onPause

I/LOG:的onSaveInstanceState保存

I /日誌:onStop

點擊在設置界面工具欄後退按鈕:

I/LOG:的onDestroy

I/LOG:的onCreate

I/LOG:savedInstanceState是空

I/LOG:在onStart

我/登錄:onResume

MainAcitivy.j AVA

import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.EditText; 
import android.util.Log; 
//... 

public class MainActivity extends AppCompatActivity { 

Toolbar toolbarMain; 
EditText editText; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.i("LOG", "onCreate"); 
    super.onCreate(savedInstanceState); 
    Log.i("LOG", "savedInstanceState is " + savedInstanceState); 
    if(savedInstanceState !=null) { 
    editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE); 
    } 
    setContentView(R.layout.activity_main); 

    editText = (EditText) findViewById(R.id.myEditText); 

    toolbarMain = (Toolbar) findViewById(R.id.toolbar); 
    toolbarMain.setTitle(R.string.app_name); 
    toolbarMain.inflateMenu(R.menu.menu_main); 

    toolbarMain.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 

      switch (item.getItemId()) { 
       case R.id.settings: 
        startActivity(new Intent(MainActivity.this, SettingsActivity.class)); 
      } 
      return true; 
     } 
    }); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    Log.i("LOG", "onRestoreInstanceState"); 
    super.onRestoreInstanceState(savedInstanceState); 
    editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    Log.i("LOG", "onSaveInstanceState saving"); 
    outState.putString("ET_KEY", editText.getText().toString()); 

} 

@Override 
public void onPause() { 
    Log.i("LOG", "onPause"); 
    super.onPause(); 
} 

@Override 
public void onStop() { 
    Log.i("LOG", "onStop"); 
    super.onStop(); 
} 

@Override 
public void onDestroy() { 
    Log.i("LOG", "onDestroy"); 
    super.onDestroy(); 
} 

@Override 
public void onStart() { 
    Log.i("LOG", "onStart"); 
    super.onStart(); 
} 

@Override 
public void onResume() { 
    Log.i("LOG", "onResume"); 
    super.onResume(); 
} 

SettingsActivity.java

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

public class SettingsActivity extends AppCompatActivity { 

SharedPreferences sharedPref; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.preferences_layout); 

    sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 

    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    //getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    // Display the fragment as the main content. 
    getFragmentManager().beginTransaction() 
      .replace(R.id.pref_content, new SettingsFragment()) 
      .commit(); 
} 
} 
+0

您不需要保存state.unless您在第一個活動中調用finish()或方向改變時,數據不會丟失。[Check this](https://stackoverflow.com/questions/) 15569790/android-onsaveinstancestate-in-back-button) – Adithya

+0

我不太理解SO線程中的討論,您要求我查看。我注意到,當我單擊導航欄 –

+0

上的後退按鈕時。 ..注意到只有onStart然後onResume被調用,edittext仍然有它的數據;我想這意味着國家沒有失去。所以在我看來,我需要重寫工具欄上的向上按鈕是如何模仿後退導航按鈕的?如果是這樣,我該怎麼做? –

回答

0

後我發現很多搜索的解決方案。希望以下幫助其他人。

最初,我試圖覆蓋向上按鈕的行爲。然而,當我嘗試覆蓋onOptionsItemSelected時,我在MenuItem上得到'can not resolve symbol'錯誤。也許有辦法做到這一點,但我無法弄清楚。我放棄了這種做法時,我注意到這個在Android Developer Docs

您不必趕在活動的onOptionsItemSelected()方法的後續行動。相反,該方法應調用其超類,如響應操作所示。按照應用清單中的指定,超類方法通過導航到父活動來響應Up選擇。

解決方案

一個解決方案,沒有工作對我來說是創建一個自定義工具欄,這樣我可以完全定義了按鈕的行爲。謝天謝地,這隻需要幾行代碼。

步驟1 - 創建新的工具欄佈局

RES /佈局/ toolbar_preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/toolbarPreferences" 
    android:background="@color/colorPrimary" 
    android:minHeight="?attr/actionBarSize" 
    android:elevation="4dp" 
    android:theme="@style/ToolbarTheme" 
    app:navigationIcon="?attr/homeAsUpIndicator" 
    app:titleTextColor="@color/white"> 

</android.support.v7.widget.Toolbar> 

注意在上面的行:

app:navigationIcon="?attr/homeAsUpIndicator" 

第2步 - 參考首選項佈局文件中的新工具欄

對我來說,在我的preferences_layout.xml:

<include layout="@layout/toolbar_preferences" /> 

第3步 - Java代碼

在SettingsActivity.java,我只好:

首先,啓動新的工具欄:

Toolbar toolbarPref = (Toolbar) findViewById(R.id.toolbarPreferences); 
    setSupportActionBar(toolbarPref); 

二,設置點擊監聽並定義bahaviour:

toolbarPref.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 

完成。

+0

這個SO線程真的幫了我很多,特別是[David Passmore的回答](https://stackoverflow.com/questions/26564400/creating-a-preference-screen-with-support-v21-toolbar)。 –