0

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

AppPreferenceActivity.java

public class AppPreferenceActivity extends PreferenceActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 

    } 

    public static class MyPreferenceFragment extends PreferenceFragment 
    { 
     @Override 
     public void onCreate(final Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref); 
     } 
    } 
} 

WeatherFragment.java (я вырезал код для удобства)

public class WeatherFragment extends Fragment implements Constants { 

    TextView currentTemperatureField; 
    TextView pressureField; 
    //... 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_weather, container, false); 
     currentTemperatureField = (TextView)rootView.findViewById(R.id.current_temperature_field); 
     pressureField = (TextView) rootView.findViewById(R.id.pressure_field); 

     //... 

     weatherAdapter = new WeatherAdapter(getContext(), weather); 
     ListView listView = (ListView)rootView.findViewById(R.id.listView); 
     listView.setAdapter(weatherAdapter); 

     return rootView; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     updateWeatherData(new CityPreference(getActivity()).getCity()); 

     sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     tempPref = sharedPrefs.getString("tempPref", "Celsius"); 
     pressurePref = sharedPrefs.getString("pressurePref","mmHg"); 

     //... 

    } 

    private void renderWeather(JSONObject json){ 
     try { 
      //... 

      if(pressurePref.equals("mmHg")) { 
       pressureField.setText(String.format("%.0f", (main.getDouble("pressure")/1.333)) + " mmHg"); 
      }else{ 
       pressureField.setText(String.format("%.0f", main.getDouble("pressure")) + " hPa"); 
      } 

      if(tempPref.equals("Celsius")) { 
       currentTemperatureField.setText(String.format("%.1f", main.getDouble("temp")) + " ℃"); 
      }else{ 
       currentTemperatureField.setText(String.format("%.1f", (main.getDouble("temp")*1.8+32)) + " ℉"); 
      } 

      //... 

     }catch(Exception e){ 
      //... 
     } 
    } 

} 

UPD Благодаря @beeb. Я уже использую OnSharedPreferenceChangeListener():

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //weatherFont = Typeface.createFromAsset(getActivity().getAssets(), "fonts/weather.ttf"); 
    updateWeatherData(new CityPreference(getActivity()).getCity()); 

    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    tempPref = sharedPrefs.getString("tempPref", "Celsius"); 
    pressurePref = sharedPrefs.getString("pressurePref","mmHg"); 

    SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
     public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
      Log.e("WeatherActivity: ","preferences have changed"); 
      //Implementation 
     } 
    }; 

    sharedPrefs.registerOnSharedPreferenceChangeListener(listener); 
} 

, но моя проблема по-прежнему "Реализация". Я не знаю, как установить новые данные в textview фрагмента.

ответ

0

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

MyPreferenceFragment myPreferenceFragment; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     myPreferenceFragment = new MyPreferenceFragment() 
     getFragmentManager().beginTransaction().replace(android.R.id.content, myPreferenceFragment).commit(); 

    } 

затем сделать метод в фрагменте, чтобы обновить TextView

publich void updateText(String text) 
{ 
    textView.setText(text); 
} 

и вызвать этот метод, если вы хотите, чтобы обновить текст, как это:

myPreferenceFragment.updateText(text); 
0

Добавить в SharedPreferences.onSharedPreferenceChangeListener() в ваш WeatherFragment.

listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
    // Implementation 
    } 
}; 

prefs.registerOnSharedPreferenceChangeListener(listener);