Как получить ссылку на компоненты внутри PreferenceActivity

#android #sharedpreferences #preferenceactivity #preference #getview

#Android #sharedpreferences #preferenceactivity #предпочтение #getview

Вопрос:

Мне нужно получить реальную ссылку на компоненты внутри PreferenceActivity.

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

Этот код возвращает представление, которое я хочу, но на самом деле это копия того, что я хочу, и изменение свойств там не изменяет реальные объекты.

Пожалуйста, обратите внимание, что мне нужно изменить некоторые свойства (например, цвет или выравнивание) компонентов там. А также я знаю, что могу использовать Layout, но по некоторым причинам я хочу сделать это просто программно

Комментарии:

1. вы можете объявить глобальную переменную «View» перед методом onCreate() и изменять ее свойства в любом месте вашего кода.

Ответ №1:

Понял: this.getListView() возвращает ViewGroup, которая содержит все в ListView. Обходя дочерние элементы, все становится доступным.

Существует только одна проблема, связанная с тем, что в событии onCreate будет заполнен список, поэтому одним из решений является опрос и проверка, заполнено ли оно (например, bt, определяющий 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 amp;amp; 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);