Android 如何获取PreferenceActivity中组件的引用

Android 如何获取PreferenceActivity中组件的引用,android,sharedpreferences,preferenceactivity,preference,getview,Android,Sharedpreferences,Preferenceactivity,Preference,Getview,我需要获得PreferenceActivity中组件的真实引用 CheckBoxPreference myPref = (CheckBoxPreference) findPreference("setting1"); View v = (View)myPref.getView(null, getListView()); 这段代码返回了我想要的视图,但实际上它是我想要的视图的副本,更改其中的属性不会更改真正的对象 请注意,我需要更改一些属性,例如组件的颜色或对齐方式。 我也知道我可以使用Layo

我需要获得PreferenceActivity中组件的真实引用

CheckBoxPreference myPref = (CheckBoxPreference) findPreference("setting1");
View v = (View)myPref.getView(null, getListView());
这段代码返回了我想要的视图,但实际上它是我想要的视图的副本,更改其中的属性不会更改真正的对象

请注意,我需要更改一些属性,例如组件的颜色或对齐方式。
我也知道我可以使用Layout,但由于某些原因,我只想通过编程方式执行它。我想:this.getListView返回一个包含ListView中所有内容的ViewGroup。通过遍历子对象,一切都可以访问

只有一个问题是,在onCreate事件中,ListView将被填充,因此一个解决方案是轮询并检查它是否被填充,例如定义一个AsyncTask

public class AsyncChecker extends AsyncTask <Void, Void, Boolean> {
public interface AsyncCheckerCallbackInterface {

    boolean checkFunction();
    void checkDone(Boolean result);
}

private int period;
private int maxTime;
final AsyncCheckerCallbackInterface callback;

public static void Start(int period, int maxTime, AsyncCheckerCallbackInterface callback){
    new AsyncChecker(period, maxTime, callback).execute();
}

public AsyncChecker(int period, int maxTime, AsyncCheckerCallbackInterface callback) {
    this.period = period;
    this.maxTime = maxTime;
    this.callback = callback;
}

@Override
protected Boolean doInBackground(Void... arg0) {
    long startTime = System.currentTimeMillis();
    while(System.currentTimeMillis() - startTime < maxTime){
        if (callback.checkFunction())
            return true;
        try {
            Thread.sleep(period);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}

@Override
protected void onPostExecute(Boolean result) {
    callback.checkDone(result);

}

可以在onCreate方法之前声明视图的全局变量,并在代码中的任何位置更改其属性。
public static void DoIt(final PreferenceActivity pref){
    AsyncChecker.Start(10, 1000, new AsyncChecker.AsyncCheckerCallbackInterface() {
        public boolean checkFunction() {
            int childCount = pref.getListView().getChildCount();
            if (childCount > 0)
                return true;
            return false;
        }

        public void checkDone(Boolean result) {
            if (result)
                new PreferencesRightAligner().Recursive(pref.getListView());
        }
    });
}

private void Recursive(View v){
    if (v instanceof CheckBox){
        TextView chk = ((TextView) v);
        ViewGroup father = (ViewGroup)chk.getParent();
        ViewGroup grandpa = (ViewGroup)father.getParent();
        //if (grandpa.indexOfChild(father) != 1){
            grandpa.removeView(father);
            grandpa.addView(father, 0);
        //}
    }
    else if (v instanceof TextView){
        TextView txt = ((TextView) v);
    }
    else if (v instanceof RelativeLayout){
        RelativeLayout lay = ((RelativeLayout) v);
        ((RelativeLayout) v).setGravity(Gravity.RIGHT);
    }
    if (count!=0 && v instanceof LinearLayout){
        LinearLayout lay = ((LinearLayout) v);
        ((LinearLayout) v).setGravity(Gravity.LEFT);
    }
    if (v instanceof ViewGroup){
        int childCount = ((ViewGroup)v).getChildCount();
        for(int i=0; i<childCount; i++) {
            View c = ((ViewGroup)v).getChildAt(i);
            Recursive(c);
        }
    }
}
DoIt(this);