フラグメント内のすべてのスピナーをフォーカス可能にするにはどうすればよいですか?
設定android:focusableInTouchMode
とandroid:focusable
私のレイアウトのXMLは効果がありません。
より一般的には、フラグメントのコントロールをループして、すべてのスピナーやすべてのEditTextなど、特定のタイプのすべてのコントロールを見つけるのに問題があります。
フラグメント内のすべてのスピナーをフォーカス可能にするにはどうすればよいですか?
設定android:focusableInTouchMode
とandroid:focusable
私のレイアウトのXMLは効果がありません。
より一般的には、フラグメントのコントロールをループして、すべてのスピナーやすべてのEditTextなど、特定のタイプのすべてのコントロールを見つけるのに問題があります。
これは私にとって非常にトリッキーだったので、ここに解決策を投稿すると思いました。これにより、特定の問題(スピナーをフォーカス可能にする方法)が解決されますが、より一般的な問題(フラグメント内のコントロールをループする方法)にも対処できます。
public class MyFragment extends Fragment {
private static ArrayList<Spinner> spinners = new ArrayList<Spinner>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// inflate the layout
View layout = inflater.inflate(R.layout.my_fragment_xml, container, false);
// cast our newly inflated layout to a ViewGroup so we can
// enable looping through its children
set_spinners((ViewGroup)layout);
// now we can make them focusable
make_spinners_focusable();
return layout;
}
//find all spinners and add them to our static array
private void set_spinners(ViewGroup container) {
int count = container.getChildCount();
for (int i = 0; i < count; i++) {
View v = container.getChildAt(i);
if (v instanceof Spinner) {
spinners.add((Spinner) v);
} else if (v instanceof ViewGroup) {
//recurse through children
set_spinners((ViewGroup) v);
}
}
}
//make all spinners in this fragment focusable
//we are forced to do this in code
private void make_spinners_focusable() {
for (Spinner s : spinners) {
s.setFocusable(true);
s.setFocusableInTouchMode(true);
s.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
v.performClick();
}
}
});
}
}
}
アクティビティにネストされたレイアウトがある場合、選択した回答はset_spinners()
機能しません。getChildCount()
最初のレベルの子供だけを与えます。getAllChildrenBFS
この答えから使用する方が良いです:
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;
}