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); 
} 

但我的问题仍然是“实施”。我不知道如何设置新的数据片段的文本。

回答

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);