2012年11月15日木曜日

[Android]2.3以前でPreferenceScreenにテーマが適用されない不具合の対処

ひょっとしたら今更感があるネタなのですが、ハマったのでメモ。

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

コメントを投稿