2016-04-12 20 views
7

Sto lavorando su una libreria che fornirà frammenti con alcuni campi di input. Questi campi di input conterranno le informazioni private dell'utente a cui l'app che utilizza la mia libreria non dovrebbe avere accesso. Pertanto, a proposito di edittexts, possiamo dire che il layout di fragment non è accessibile dall'attività (findViewById, getChildAt ..) a cui questo allegato è associato.È possibile disabilitare l'accesso al layout (viste) del frammento dall'attività principale?

L'utilizzo della finestra di dialogo o un'altra attività non è accettabile, questo frammento deve essere incluso direttamente nel layout dell'attività.

E 'anche possibile in Android?

Stavo pensando di creare viste dinamicamente e di sovrascrivere metodi come getChildAt per impedire l'accesso alle viste secondarie, ma prima di iniziare a "giocare" con questo problema, preferisco chiedere qui alcune opinioni.

+1

L'unica idea che ho è di avere TextWatchers nei tuoi EditTexts, che realizzerà una cifratura immediata dei dati inseriti. E memorizzare dati privati ​​reali da qualche parte nel sistema Keystore, per esempio. Ma non so come implementare questo :) –

+0

@GoltsevEugene utilizzando la crittografia non è una cattiva idea, buon punto. – Palejandro

+0

È possibile disabilitare l'evento tattile per tutte le visualizzazioni e sovrascrivere il metodo getView di Fragment e restituire null. In modo che nessuno possa ottenere la tua vista Frammento usando questo metodo ... questo è quello che sto pensando .... – Moinkhan

risposta

0

Non ho capito correttamente, suppongo, ma penso che nulla creato dalla modalità di accesso privato non sia accessibile dall'esterno.

+0

L'accesso privato non è accettabile a causa della riflessione java – Palejandro

3

Android non fornisce un modello per tale utilizzo. I metodi di sovrascrittura renderanno sicuramente più difficile l'accesso a queste viste, ma non impossibile. La tua classe di visualizzazione personalizzata deve memorizzare i suoi figli da qualche parte. Anche se questo è un campo privato, la riflessione può accedervi.

Un'attività ha il pieno controllo del suo contenuto e non penso che tu possa impedirlo.

+0

sì, hai ragione, Android non è costruito per una cosa del genere , ma ero curioso se qualcuno si imbattesse in questo problema. Suppongo che, se c'è una risposta a questo problema, non sarà facile da implementare :(. (Un sacco di override, crittografia) Aspetterò qualche altro giorno per un altro parere .. – Palejandro

0

Hai mai pensato di utilizzare la visualizzazione Web per il tuo problema particolare !!!

fare un frammento e in esso mostrare la tua webview desiderata e lasciare che l'utente inserisca tutto ciò che gli piace.

in questo modo l'ALTRA APP non ha accesso a EditTexts.

+0

Sì, ho anche considerato questa opzione ma è possibile accedere a Webview dall'esterno e ciò significa che è anche contenuto .. – Palejandro

2

Prima di tutto ciò che si vuole non è un buon approccio, e quello che sto suggerendo è solo un'idea, non è testato e consigliato, ma può fare il vostro lavoro

Crea classe BaseFragment e si estendono ogni classe con Base Frammento deve ignorare la sua getView()

In questi avvicinato è necessario rimuovere vista root come un membro della classe GetView restituisce lo stesso

public class BaseFragment extends Fragment { 

    @Nullable 
    @Override 
    public View getView() { 
    super.getView(); 
    } 
} 

Ora è possibile farlo in due modi

Crea boolean in BaseFragment con accesso privatoboolean canAccess = true; senza getter e setter e la definizione cambiamento della vostra getView() per

public BaseFragment() { 
    canAccess = false; 
} 

@Nullable 
@Override 
public View getView() { 
    if(canAccess) 
     return super.getView(); 
    return 
     null; 
} 

È necessario chiamare super() per ogni vostro bambino costruttori, ora se si accede a getView all'interno della classe canAccess è vero così si otterrà la vista attuale altrimenti si otterrà nulla.

Come da documentazione

ottenere la visualizzazione principale per il layout del frammento (quello restituito da {#onCreateView @link}),

se disponibile @return vista radice del frammento, o null se non ha un layout.

Seconda opzione è molto più semplice

@Nullable 
@Override 
public View getView() { 
    try { 
     throw new Exception("Who called me?"); 
    } catch (Exception e) { 
     String className = e.getStackTrace()[1].getClass().getCanonicalName(); 
     if (className.equals(YourParentActivity.class.getCanonicalName())) 
      return null; 
     else 
      return super.getView(); 
    } 
} 
+0

alcune buone idee, ma si basa anche su canAccess booleano che può essere modificato utilizzando la riflessione – Palejandro

+0

seconda opzione non ha alcun valore booleano, ed è molto facile facile –

0

È possibile ignorare del TextView getText() e restituire null per le viste private. Se qualcuno otterrà questa visualizzazione di testo, non sarà in grado di ottenerne il contenuto.

1

È possibile disattivare i contenuti all'interno del vostro frammento utilizzando seguente metodo:

public void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) { 
    int childCount = viewGroup.getChildCount(); 
    for(int i = 0; i < childCount; i++) { 
     View view = viewGroup.getChildAt(i); 
     view.setEnabled(enabled); 
     if (view instanceof ViewGroup) { 
      enableDisableViewGroup((ViewGroup) view, enabled); 
     } 
    } 
} 

Si può semplicemente chiamare sopra metodo come segue:

enableDisableViewGroup((ViewGroup) rootView, true); // disable 

enableDisableViewGroup((ViewGroup) rootView, false); // enable 

Questo metodo funziona per entrambi i frammenti e gli adattatori per disattivare/abilitare i loro contenuti.