0

ユーザー変更の設定後に2つのテキストビューをフラグメントで更新する必要があります。私はすでに同様の質問をたくさん探していますが、それは私を助けません。毎回すべてのアプリケーションを更新しようとしていますが、私はそれが最良の解決策ではないと確信しています。 助けていただければ幸いです。プリファレンスが変更された後にフラグメント内のテキストビューを更新する方法

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){ 
      //... 
     } 
    } 

} 

@beebにUPD ありがとうございます。私はすでに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

このようにFragmentを渡すのではなく、インスタンスを作成して以下のアプローチを採用します。その後、

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); 
関連する問題