2015-10-09 32 views
6

Ho uno scenario in cui quando si verifica un'azione, voglio rendere visibili determinati campi. Funziona bene, tuttavia quando chiamo setVisible (View.VISIBLE) su un LinearLayout che contiene alcuni altri campi, come ad esempio TextEdit, lo stato attivo passa a TextEdit (o almeno lo schermo scorre ad esso).Non si cambia messa a fuoco quando si chiama setVisibility (View.VISIBLE)

C'è un modo per non avere il cambio di messa a fuoco quando si chiama setVisibility (View.VISIBLE)?

Il layout XML del LinearLayout posso chiamare setVisible on:

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

Il codice che inizializza:

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

    } 

e il codice che sta chiamando la setVisibility:

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

Grazie!

UPDATE

Grazie al mio amico qui di seguito, il seguente codice funziona. In pratica, rende tutti i discendenti di LinearLayout non in grado di ottenere la messa a fuoco, il che significa che quando resi visibili lo schermo non scorre verso di loro poiché non ottengono la messa a fuoco. L'unico modo per la data che ho trovato per evitare che ciò accada ...

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

impostazione Prova 'editText.setFocusable (false)' – Jas

risposta

4

Si potrebbe provare il android:descendantFocusability con beforeDescendants parametro sul tuo 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

Questo deve accadere in fase di esecuzione ... in fondo ho bisogno di fare il contenuto del LinearLayout visibile ma non voglio i discendenti per ottenere visibilità. Non sembra essere un metodo sulla vista. –

+0

Wow! Ha funzionato davvero ... grazie! Devo fare però quanto segue: \t \t \t \t (ViewView) fieldView) .setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); \t \t \t \t fieldView.setVisibility (View.VISIBLE); \t \t \t \t (Vista campo) Vista. .setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); –

+0

Penso che puoi impostare il parametro che ho scritto sopra nel tuo file .xml e dovrebbe funzionare bene. Basta aggiungere 'android: descendantFocusability = "blocksDescendants" –