2015-09-18 3 views
0

Я использую фрагмент для нескольких видов деятельности, чтобы показать ShowCaseView, все в порядке, но я хочу отключить элементы управления, которые были показаны ShowCaseView во время презентации, предотвратить их от нажатия до завершения презентации.Получить макет из фрагмента и заблокировать все его дочерние элементы

Как что:

getActivity().getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.btnJournal).setEnabled(false); 

я могу отключить один элемент, который я знаю об этом, но я хочу, чтобы все Чайлдс этого мнения и сделать их все инвалид без явного написания их идентификаторов, но то, что я получаю с getActivity().getWindow().getDecorView().findViewById(android.R.id.content) является просмотр и не ViewGroup или LinearLayout, если я бросил его в ViewGroup - он не может найти ни одного ребенка, если я бросил его в LinearLayout, то хорошо:

`Caused by: java.lang.ClassCastException: com.android.internal.policy.impl.PhoneWindow$DecorView cannot be cast to android.widget.LinearLayout` 

Как я могу перебирать это дети ?

ответ

0

Я нашел следующее решение:

Во-первых, я использовал фрагмент кода here - спасибо MH. чтобы получить весь ребенок Просмотры:

private List<View> getAllChildrenBFS(View v) { 
    List<View> visited = new ArrayList<View>(); 
    List<View> unvisited = new ArrayList<View>(); 
    unvisited.add(v); 

    while (!unvisited.isEmpty()) { 
     View child = unvisited.remove(0); 
     visited.add(child); 
     if (!(child instanceof ViewGroup)) continue; 
     ViewGroup group = (ViewGroup) child; 
     final int childCount = group.getChildCount(); 
     for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i)); 
    } 

    return visited; 
} 

Так, в коде моего фрагмента, я написал, чтобы получить ссылку на просмотр контента и установить элементы управления отключены следующий код:

ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content); 
    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(false); 

, а затем аналогичный код установить их включена после того, как работа сделана:

ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content); 
    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(true); 

Так что теперь я крут и счастлив, что я не потратил весь день зря))