1

フラグメント内のすべてのスピナーをフォーカス可能にするにはどうすればよいですか?

設定android:focusableInTouchModeandroid:focusable私のレイアウトのXMLは効果がありません。

より一般的には、フラグメントのコントロールをループして、すべてのスピナーやすべてのEditTextなど、特定のタイプのすべてのコントロールを見つけるのに問題があります。

4

2 に答える 2

3

これは私にとって非常にトリッキーだったので、ここに解決策を投稿すると思いました。これにより、特定の問題(スピナーをフォーカス可能にする方法)が解決されますが、より一般的な問題(フラグメント内のコントロールをループする方法)にも対処できます。

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();
                    }
                }
            });
        }
    }


}
于 2013-03-13T16:10:14.010 に答える
1

アクティビティにネストされたレイアウトがある場合、選択した回答は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;
}
于 2014-12-26T16:42:13.460 に答える