2016-09-07 7 views
0

私はAndroidアプリを開発する方法を学ぼうとしています。私はYouTubeでのビデオチュートリアルに続き、単純なアプリケーション設定画面をアプリケーションに追加することで終了しました。戻るボタンを押したときにPreferenceScreenからApp Preferencesを保存する

ただし、携帯電話のナビゲーションバーで[戻る]ボタンを押すと、変更された設定は適用されません。

私はGoogleで検索しようとしましたが、私が見つけた解決策はありませんでした。提案された解決策で何が起こっているのかをまだ理解していないという事実も、この1つの問題を解決する上での私の難しさに貢献するかもしれません。

私がアプリケーションから期待する動作は、ナビゲーションバーの[戻る]ボタンを押すと、変更された設定が適用されるということです。

たとえば、暗い背景の設定は、チェックボックスで制御されます。現在の動作は次のとおりです。暗い背景の設定を確認します。ナビゲーションバーの[戻る]ボタンを押すと、設定は適用されません(MainActivityの環境設定を読み込むメソッドがあります)。バックボタンを押すと暗い背景が適用されます。

私が理解しているように、onBackPressedを上書きすることはこのトリックを行うべきだと考えていますが、設定を正しく適用するためには何を実行するべきかわかりません。

私のPreferenceScreenのクラスとレイアウトは次のとおりです。 XML上の文字列に関しては、実際にはハードコーディングされていません。ここに英語の値をコピーして、インターフェイスに表示されるテキストを表示しました。

public class AppPreferences extends AppCompatActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_note_detail); 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     SettingsFragment settingsFragment = new SettingsFragment(); 
     fragmentTransaction.add(android.R.id.content, settingsFragment, "SETTINGS_FRAGMENT"); 
     fragmentTransaction.commit(); 
    } 

    public static class SettingsFragment extends PreferenceFragment 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 

      addPreferencesFromResource(R.xml.app_preferences); 
     } 
    } 
} 

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
     android:title="General"> 
     <EditTextPreference 
      android:title="Notebook" 
      android:summary="The title that will be used on the main action bar." 
      android:key="title" 
      android:defaultValue="Notebook" /> 
    </PreferenceCategory> 

    <PreferenceCategory 
     android:title="Color"> 
     <CheckBoxPreference 
      android:title="Dark Background" 
      android:summary="Is the main background color dark?" 
      android:key="background_color" 
      android:defaultValue="false" /> 
    </PreferenceCategory> 
</PreferenceScreen> 
+0

ようこそStackOverflow。尋ねる方法のガイドラインを読んでください:http://stackoverflow.com/help/how-to-ask。あなたの説明には、どんな振る舞いが予想されるのかを含めるべきです。また、より関連性の高いコードは、あなたがしようとしていることの十分なコンテキストを提供していません。 – Chisko

+0

質問にさらに詳しい説明が追加されました – tady159

答えて

0

あなたは

public class AppPreferences extends AppCompatActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

    super.onCreate(savedInstanceState); 

    //setContentView(R.layout.activity_note_detail); 

    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    SettingsFragment settingsFragment = new SettingsFragment(); 
    fragmentTransaction.add(android.R.id.content, settingsFragment, "SETTINGS_FRAGMENT"); 
    fragmentTransaction.commit(); 
} 

public static class SettingsFragment extends PreferenceFragment 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.app_preferences); 

     Preference preference = findPreference("background_color"); 
     preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object newValue) { 

       //do your action here 

       return false; 
      } 
     }); 
    } 
}  

} 

やその他の活動からを使用する必要があります:

PreferenceManager.setDefaultValues(this, R.xml.your_setting_xml, false); 
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 

if (settings.getBoolean("background_color", true)) { 
//do your action here 

......... 

は、(それが同様のユースケースを持っている)、また、この質問を参照してください: Checkbox Preference and Checking if its enabled or disable

+0

ありがとう、私はこれを試して結果を返すよ – tady159

+1

あなたの提案はうまくいった。しかし、あなたがリンクした質問と比較して、SharedPreferencesを別の方法で取得しなければなりませんでした。 'getSharedPreferences'メソッドはリスナーの中で利用できませんでしたので、' PreferenceManager.getDefaultSharedPreferences(getActivity()) 'を代わりに使用しました。 ありがとうございました。 – tady159

+0

それを聞いてうれしく、すべてのベスト。 –

0

@Chiskoは、私たちはあなたの最終目標を把握できるようにするために十分なコードは、あなたの質問には存在しない、言ったように - 私はあなたがにあなたのアプリケーションのための永続的なストレージのいくつかのフォームを希望している推測しているが、あなたのアプリの設定を保存することができます。このためには、SharedPreferencesというAndroidで何かを使用したいと思うでしょう。これにより、後でアクセスする簡単なデータ型を保存することができます。

このリンクに読み取りを与えてから、単純なデータを1つ保存して読み込めます。アクティビティの開始時にSharedPreferencesからロードする必要があります(まだ保存されていない場合はデフォルト値を指定できます)。次に、あなたが言ったようにデータをonBackPressed()に保存することをお勧めします。

あなたが問題に遭遇した場合は、ここでコメントしてください。

+0

ありがとうございました。 @Abdulhamid Dhaibanの答えは、私が問題を解決するのを助けました。 – tady159

0

@Abdulhamid Dhaibanは正しくそれを指摘します。

私はあなたの提案にonBackPressed()メソッドをオーバーライドする方法を追加します。

あなた(トップ<を左 - )ボタン「UP」がいる場合、正しい結果を提供し、あなただけの次のコードを追加することによって、Upボタンのように動作するために[戻る]ボタンを設定することができます。

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    NavUtils.navigateUpFromSameTask(this); 
} 

がそれを願っています助けて!

関連する問題