2014-09-16 3 views
1

Один вопрос: У меня есть EditTextPreference, чтобы пользователь вводил путь по умолчанию для приложения.Как получить оценку от предпочтений

Как я могу управлять тем, что новое значение должно быть видно в используемом фрагменте предпочтений?

После того, как пользователь нажал ok в окне настроек, чтобы выполнить новые настройки, я хочу написать новый путь в виде сводки под заголовком.

Я уже пробовал работать с onSharedPreferenceChanged, но это не сработало. Я не знаю, как получить доступ к полю редактирования из всплывающего окна, в котором находится текст пользователя.

Надеемся найти помощь Andreas!

Редактировать: Вот исходный код для всего PreferenceFragment, который я использовал и модифицировал с предложениями Rustam. К сожалению, это не сработает.

package com.example.wbsettings; 

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

public class PreferenceFrag extends PreferenceFragment 
implements SharedPreferences.OnSharedPreferenceChangeListener{ 

public static final String KEYVAL = "startpath"; 
SharedPreferences sp; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.preferences); 

    EditTextPreference prefUrl = (EditTextPreference) findPreference(KEYVAL); 
    prefUrl.getEditText().setHint("default path"); 

    //>> Here the app crashed when I debug it 
     ------------------------------------ 
    prefUrl.setSummary(sp.getString(KEYVAL, "")); 

}//onCreate 

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { 
    Preference pref = findPreference(key); 
    if (pref instanceof EditTextPreference) { 
     EditTextPreference etp = (EditTextPreference) pref; 
     pref.setSummary(etp.getText()); 

    } 
}//onSharedPreferenceChanged 

} 

То, что я также не понимаю, в вашем примере: Где предпочтения для регистрации с OnSharedPreferenceChangeListener? Я имею в виду, что на данный момент я никогда не достигаю процедуры onSharedPreferenceChanged из-за сбоя. Но когда я делаю комментарий, и приложение работает и закончено, я никогда не останавливался в точке останова, установленной в процедуре onSharedPreferenceChanged.

Другой вопрос: Что лучше всего ответить на комментарий, если ответ слишком длинный для другого комментария? Я попытался открыть ответ на свой вопрос. Но всплывающее сообщение сообщило мне, что это не так, как должно быть. Так что делать?

С уважением, Андреас!

+0

один простой вопрос: Вы зарегистрированы Ваши предпочтения в OnSharedPreferencesChangedListener? Большинство poeple забудьте об этом ... – Opiatefuchs

+0

Спасибо за это. Да, я сделал это - после того, как забыл об этом и раньше. –

ответ

6

ваш menu_setting.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/menu_settings" 

     android:orderInCategory="100" 
     android:showAsAction="never" 
     android:title="@string/menu_settings" 
     android:icon="@android:drawable/ic_menu_preferences"/> 

</menu> 

ваш preference.xml:

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

    <EditTextPreference 
     android:dialogTitle="Enter path" 
     android:key="prefPath" 
     android:summary="" 
     android:title="Path Setting" /> 

</PreferenceScreen> 

ваш PreferenceFrag должен выглядеть следующим образом:

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

public class PreferenceFrag extends PreferenceFragment 
implements SharedPreferences.OnSharedPreferenceChangeListener{ 

public static final String KEYVAL = "prefPath"; 
SharedPreferences sp; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.preference); 

    EditTextPreference prefPath = (EditTextPreference) findPreference(KEYVAL); 
    prefPath.getEditText().setHint("sdcard/path"); 

    // Here the app crashed when I debug it 

    SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 

     prefPath.setSummary(sp.getString(KEYVAL, "")); 



}//onCreate 


@Override 
public void onResume() { 
    super.onResume(); 
    // Set up a listener whenever a key changes 
    getPreferenceScreen().getSharedPreferences() 
      .registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    // Unregister the listener whenever a key changes 
    getPreferenceScreen().getSharedPreferences() 
      .unregisterOnSharedPreferenceChangeListener(this); 
} 


public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { 
    Preference pref = findPreference(key); 
    if (pref instanceof EditTextPreference) { 
     EditTextPreference etp = (EditTextPreference) pref; 
     pref.setSummary(etp.getText()); 

    } 
}//onSharedPreferenceChanged 

} 

ваш PreferenceActivity:

import android.app.Activity; 
import android.os.Bundle; 

public class PreferenceActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    getFragmentManager().beginTransaction().replace(android.R.id.content, 
       new PreferenceFrag()).commit(); 
} 

} 

ваш MainActivity:

import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    private TextView textview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textview=(TextView)findViewById(R.id.textview); 


    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_setting, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

     case R.id.menu_settings: 
      Intent i = new Intent(this, PreferenceActivity.class); 
      startActivity(i); 
      break; 

     } 

     return true; 
    } 



} 

наконец AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.preferencetest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="18" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.preferencetest.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="com.example.preferencetest.PreferenceActivity"/> 
    </application> 

</manifest> 
+0

Большое спасибо за эту интересную идею. Я попробую это позже в этот день и надеюсь, что это сработает. –

+0

@ArthurMeier, если он работает, тогда проголосовать за мой ответ – Rustam

+0

Привет, Рустам, Извините за поздний ответ. Я был занят другими вещами в последние дни. Извините, но ваш код не работает. Он разбился, когда я пришел к 'prefUrl.setSummary (sp.getString (KEYVAL, "")); ' Я редактирую свой вопрос, чтобы показать весь исходный код, который я использую для FraqmentPreferences. Может быть, вы можете увидеть причину аварии? Andreaas –

Смежные вопросы