2015-10-09 9 views
6

アクションが発生したときに特定のフィールドを表示したいシナリオがあります。これはうまくいきますが、TextEditなどのいくつかのフィールドを含むLinearLayoutでsetVisible(View.VISIBLE)を呼び出すと、フォーカスがTextEditに移動します(または少なくとも画面がスクロールします)。setVisibility(View.VISIBLE)を呼び出すときにフォーカスを変更しない

setVisibility(View.VISIBLE)を呼び出すときにフォーカスを変更しない方法はありますか?

私は上のsetVisibleを呼び出すことができますのLinearLayoutのXMLレイアウト:

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:focusable="true" 
    android:focusableInTouchMode="true"> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18sp" 
     android:textStyle="normal" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:paddingBottom="5dp" 
     android:text="" /> 

    <EditText android:id="@+id/entry" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:inputType="textMultiLine" 
     android:gravity="right" /> 

    <View 
     android:layout_marginTop="8dp" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@color/grey" 
     android:visibility="gone" /> 

</LinearLayout> 

それを初期化するコード:

private TextView mName; 
private EditText mEntry; 

が...

 private void initialize() { 

     LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.field_multiline_entry, this); 

     // setup fields 
     mName = (TextView)findViewById(R.id.name); 
     mEntry = (EditText)findViewById(R.id.entry); 
     mEntry.addTextChangedListener(textWatcher); 

    } 

とコードsetVisibilityを呼び出しています:

 if(sectionFieldView != null && sectionFieldView.getVisibility() != View.VISIBLE) 
     { 
      sectionFieldView.setVisibility(View.VISIBLE); 
     } 

ありがとうございました!

UPDATE以下の私の友人に

おかげで、次のコードは動作します。基本的には、LinearLayoutのすべての子孫がフォーカスを得ることができなくなります。つまり、フォーカスが得られないときに画面がスクロールしないようにすることを意味します。私が起きてからこれを維持することが分かってきたこれまでの唯一の方法...

 ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
     fieldView.setVisibility(View.VISIBLE); 
     ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 
+0

これは、実行時に発生する必要があります 'editText.setFocusable(偽)' – Jas

答えて

4

あなたのLinearLayoutにbeforeDescendantsパラメータでandroid:descendantFocusabilityを試してみてください?

Constant Value Description 
beforeDescendants 0 The ViewGroup will get focus before any of its descendants. 
afterDescendants 1 The ViewGroup will get focus only if none of its descendants want it. 
blocksDescendants 2 The ViewGroup will block its descendants from receiving focus. 
+0

を設定してみてください...基本的に、私はのLinearLayoutの中身が表示されるように必要がありますが、子孫が可視性を取得する必要はありません。ビュー上のメソッドではないようです。 –

+0

うわー!それは実際に働いた...ありがとう!私は次のことを行う必要があります:\t \t \t \t((ViewGroup)fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); \t \t \t \t fieldView.setVisibility(View.VISIBLE); \t \t \t \t((ViewGroup)fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); –

+0

私はあなたの.xmlファイルに上記で書いたパラメータを設定することができ、うまくいくはずだと思います。 'android:descendantFocusability = "blocksDescendants"を追加してください。 –