2015-10-09 44 views
6

Mam scenariusz, w którym po wykonaniu akcji chcę, aby niektóre pola były widoczne. Działa to dobrze, jednak kiedy wywołuję setVisible (View.VISIBLE) na LinearLayout, który zawiera kilka innych pól, takich jak TextEdit, fokus przesuwa się do TextEdit (lub przynajmniej ekran przewija się do niego).Nie zmienia się fokus podczas wywoływania setVisibility (View.VISIBLE)

Czy istnieje sposób, aby nie zmieniać ostrości podczas wywoływania setVisibility (View.VISIBLE)?

Układ XML z LinearLayout mogę wywołującego setVisible na:

<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> 

kod, który inicjuje go:

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

    } 

I kod, który dzwoni setVisibility:

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

Dzięki!

UPDATE

Dzięki moim przyjacielem poniżej następujący kod działa. Zasadniczo sprawia, że ​​wszyscy potomkowie LinearLayout nie są w stanie uzyskać fokusa, co oznacza, że ​​gdy jest widoczny, ekran nie przewija się do nich, ponieważ nie uzyskują ostrości. Tylko w ten sposób do tej pory znalazłem utrzymać takiej sytuacji ...

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

spróbuj ustawić 'editText.setFocusable (false)' – Jas

Odpowiedz

4

Możecie spróbować android:descendantFocusability z beforeDescendants parametr na swoim LinearLayout?

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

To musi się zdarzyć w czasie wykonywania ... w zasadzie muszę dokonać zawartości LinearLayout widzialnym, ale nie chcą potomkowie uzyskać widoczność. Nie wydaje się być metodą w widoku. –

+0

Wow! To faktycznie zadziałało ... dzięki! Muszę jednak wykonać następujące czynności: \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

Myślę, że możesz ustawić parametr, który napisałem powyżej w twoim pliku .xml i powinien działać poprawnie. Po prostu dodaj "android: descendantFocusability =" blocksDescendants " –