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 件のコメント:
コメントを投稿