2017-05-08 13 views
0

私はアンドロイドの初心者です。私はShared Preferencesの実装に関して混乱しています。私の目標は、ユーザーがMainFragmentで使用されるテキストを定義する文字列を使用することです。アプリケーションが実行されているときにユーザーがその文字列を変更できるという事実を考えると、リスナーも必要です。ですから、これまでのある書籍によると、私はSettingsActivityとSettingsFragmentを持っています。これまでAndroid SharedPreferences confusion

SettingsActivity:これまで

public class SettingsActivity extends AppCompatActivity { 

private SharedPreferences prefs; 
private String stringIWantToSave; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_settings); 
    getFragmentManager().beginTransaction(). 
      replace(android.R.id.content, new SettingsFragment(), "settings_fragment").commit(); 
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    stringIWantToSave = prefs.getString("stringIWantToSave", "myString"); 

} 

} 

がSettingsFragment:

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

private SharedPreferences sharedPreferences; 
private String stringIWantToSave; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
} 

@Override 
public void onPause() { 
    sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    sharedPreferences.getString("stringIWantToSave", "myString"); 
    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 

} 
} 

私の質問は以下のとおりです。方法で

•どのように私は、ユーザーから変更された値を保存する必要がありますか?

•リスナーを実装して、文字列が変更されたことをMainFragmentに通知するにはどうすればよいですか? EditTextPreferenceSettingsActivityを達成するために

+0

者が設定アクティビティとフラグメントのためのクラスです〜、あなたはおそらくそれらを必要としません役立つことを願っています。私はあなたが何をしようとしているのか分かりませんが、ユーザーがいつこの文字列を変更できるかを知っていれば、それが変更されているかどうかを確認することができます。 SharedPreferencesは、すべてのActivityおよびFragmentクラスで使用できます。 – fapps

+0

@fapps私は彼の名前を言うように変更する機能をユーザーに提供しようとしています。私は、メニューを配置し、メニュー内に、EditTextPreferenceがユーザに自分の名前を書き留めることを許可する設定というタブを設定することにしました。だからこそ私はそれらのクラスを作りました。 – kDoyle

+0

したがって、xmlレイアウトでEditTextPreferenceを使用している場合は、キー値を 'key =" stringIWantToSave "で設定するだけで、必要なものすべてが実行されます。余分なコードはありません。 – fapps

答えて

0

1.は、まずあなたはEditTextPreferenceが含まれているPreferenceScreenを作成する必要があります。

あるpreferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

    <EditTextPreference 
     android:key="pref_key_name" 
     android:title="Name" 
     android:summary="Enter your name here!" 
     android:dialogTitle="Enter name:"> 

    </EditTextPreference> 
</PreferenceScreen> 

2.PreferenceFragmentを拡張Fragmentを作成します。 UIをuserに入力してnameと入力すると、initializationが表示され、OnSharedPreferenceChangeListenerにはupdateが追加されます。

SettingsFragment.java:

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

    // Preference Keys 
    public static final String KEY_PREF_NAME = "pref_key_name"; 

    // Shared preference 
    SharedPreferences mSharedPreferences; 

    // Name preference 
    EditTextPreference mPreferenceName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     // Shared preference 
     mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

     // Name preference 
     mPreferenceName = (EditTextPreference) getPreferenceScreen().findPreference(KEY_PREF_NAME); 

     // Initialize 
     initPreferences(); 
    } 

    public void initPreferences() 
    { 
     // Name 
     String oldName = mSharedPreferences.getString(KEY_PREF_NAME, "Enter your name here!"); 
     // Update view 
     mPreferenceName.setSummary(oldName); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) { 

     if(key.equals(KEY_PREF_NAME)) 
     { 
      // Name 
      String currentName = sharedPref.getString(key, "DEFAULT_VALUE"); 
      // Update view 
      mPreferenceName.setSummary(currentName); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 
} 

3.最後に、SettingsActivityを作成し、そのFrameLayoutSettingsFragmentを示しました。

SettingsActivity.java:

preferenceからnameを更新使用するには、お使いのactivityまたはfragmentsonResume()メソッド内preferenceからname値を取得:

ご使用方法

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 

public class SettingsActivity extends AppCompatActivity { 

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

     // Settings Fragment 
     SettingsFragment settingsFragment = new SettingsFragment(); 
     getFragmentManager().beginTransaction().replace(R.id.content, settingsFragment).commit(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

} 

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { super.onResume(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); // Name String name = sharedPreferences.getString(SettingsFragment.KEY_PREF_NAME, "DEFAULT_VALUE"); // Do something with name ................ ........................ } } 

OUTPUT:

enter image description here

これは