Android 如何获取PreferenceActivity中组件的引用
我需要获得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
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);