0

我需要真正引用 PreferenceActivity 中的组件。

CheckBoxPreference myPref = (CheckBoxPreference) findPreference("setting1");
View v = (View)myPref.getView(null, getListView());

此代码返回我想要的视图,但它实际上是我想要的内容的副本,并且在那里更改属性,不会更改真实对象。

请注意,我需要在那里更改组件的一些属性(例如颜色或对齐方式)。而且我知道我可以使用布局,但由于某些原因,我想以编程方式进行

4

1 回答 1

0

弄清楚:this.getListView() 返回一个 ViewGroup,其中包含 ListView 中的所有内容。通过遍历孩子,一切都可以访问。

只有一个问题是在 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);

}

}

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);
        }
    }
}

在 onCreate 中:

DoIt(this);
于 2014-06-17T09:57:52.370 回答