Czy widoki Androida mają coś podobnego do selektorów klasy CSS? Coś podobnego do R.id, ale użyteczne dla wielu widoków? Chciałbym ukryć pewną grupę widoków niezależnie od ich pozycji w drzewie układu.Odpowiednik selektorów klas CSS dla widoków Androida?
12
A
Odpowiedz
4
Myślę, że będziesz musiał przejrzeć wszystkie widoki w swoim układzie, szukając androida: id, którego chcesz. Następnie możesz użyć opcji View setVisibility(), aby zmienić widoczność. Możesz również użyć widoku setTagTag()/getTag() zamiast android: id, aby oznaczyć widoki, które chcesz obsłużyć. Na przykład, poniższy kod wykorzystuje metodę ogólnego przeznaczenia przemierzać układ:
// Get the top view in the layout.
final View root = getWindow().getDecorView().findViewById(android.R.id.content);
// Create a "view handler" that will hide a given view.
final ViewHandler setViewGone = new ViewHandler() {
public void process(View v) {
// Log.d("ViewHandler.process", v.getClass().toString());
v.setVisibility(View.GONE);
}
};
// Hide any view in the layout whose Id equals R.id.textView1.
findViewsById(root, R.id.textView1, setViewGone);
/**
* Simple "view handler" interface that we can pass into a Java method.
*/
public interface ViewHandler {
public void process(View v);
}
/**
* Recursively descends the layout hierarchy starting at the specified view. The viewHandler's
* process() method is invoked on any view that matches the specified Id.
*/
public static void findViewsById(View v, int id, ViewHandler viewHandler) {
if (v.getId() == id) {
viewHandler.process(v);
}
if (v instanceof ViewGroup) {
final ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
findViewsById(vg.getChildAt(i), id, viewHandler);
}
}
}
3
Można ustawić sam znacznik do wszystkich takich poglądów, a następnie można uzyskać wszystkie widoki Mając to tag z prostej funkcji takich jak to:
private static ArrayList<View> getViewsByTag(ViewGroup root, String tag){
ArrayList<View> views = new ArrayList<View>();
final int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = root.getChildAt(i);
if (child instanceof ViewGroup) {
views.addAll(getViewsByTag((ViewGroup) child, tag));
}
final Object tagObj = child.getTag();
if (tagObj != null && tagObj.equals(tag)) {
views.add(child);
}
}
return views;
}
Jak wyjaśniono w Shlomi Schwartz answer. Oczywiście nie jest to tak użyteczne, jak klasy css. Ale może to być trochę przydatne w porównaniu do pisania kodu, aby wielokrotnie powtarzać swoje poglądy.