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