2.3以前のOSだとPreferenceScreenを入れ子にしたPreferenceを生成するとテーマが正しく適用されないバグがあるみたいです。
Issue 4611: Background from PreferenceActivity is not applied to sub-PreferenceScreen
つまり、下記のようなXMLをPrefereceActivityに読み込ませると子のPreferenceScreenにはテーマが正常に適用されません。
preference.xml
最初のPreferenceはちゃんと表示されますが、
メニュー2を表示させようとすると、こうなります。
対策として上記リンクのコメント20に書かれていた対策を実施しました。
具体的には子のPreferenceScreenはxmlを分けて、Intent呼び出しでもう1つPreferenceActivityを生成して表示するようにします。
なのでPreferenceActivityではIntentの中身を見て読み込むxmlを切り替えます。
preference.xml
preference2.xml
MainActiviy.jara
package jp.inara.sample.preferencebug; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent = new Intent(this, MyPreferenceActivity.class); intent.setData(Uri.parse("preferences://preference1")); startActivity(intent); return true; } }
MypreferenceActivity.java
package jp.inara.sample.preferencebug; import android.os.Bundle; import android.preference.PreferenceActivity; public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getIntent().getData().toString().equals("preferences://preference2")) { addPreferencesFromResource(R.xml.preference2); } else { addPreferencesFromResource(R.xml.preference); } } }
こんな感じにするとちゃんと子のPreferenceScreenが表示されるようになります。
気をつけなくちゃいけないのは、PreferenceActivityを呼び出すところでIntentにDataをセットし忘れないようにすることですかね。
0 件のコメント:
コメントを投稿