utilizzando findViewById in una classe che non si estende attività in Android
-
26-10-2019 - |
Domanda
ho una classe che è attualmente estendendo attività e devo metodi come findViewById, ArrayAdapter etc. Voglio trasformarlo in una classe indipendente, ma tutti i metodi di cui sopra Divento indefinito. Qual è il problema? Non dovrebbe importando le classi essere abbastanza? Per esempio, ho importare android.view.View per findViewById ma fa ancora alcuna differenza. Si prega di avvisare.
Soluzione
si dovrebbe passare l'istanza della vostra attività al vostro seconda classe sul costruttore in questo modo:
Nel vostro Activity
instanciate tua classe in questo modo:
MyClass instance = new MyClass(this);
E nella vostra seconda classe, il costruttore sarà simile a questo:
public class MyClass {
public Activity activity;
//.... other attributes
public MyClass( Activity _activity){
this.activity = _activity;
//other initializations...
}
}
e poi quando si desidera utilizzare il metodo findViewById()
, si può fare in questo modo:
EditText txt = (EditText)this.activity.findViewById(R.id.txt);
Altri suggerimenti
se si desidera chiamare qualsiasi funzione che appartiene a Activity
allora unica cosa che dovete avere è contesto della Activity
.
ad es.
class A extends Activity {
Context ctx;
void onCreate(Bundle b)
ctx = this;
B bob = new B(ctx);
}
}
Ecco di classe B.
class B {
B (Activity a) {
a.anyFunctionOfActivity();
}
}
findViewById è non-statico del Activity
Classe , quindi è solo disponibile per un Activity
oggetto . Pertanto, l'importazione e android.view.View
android.app.Activity
non renderlo disponibile. Per renderlo disponibile, si poteva passare intorno ad un oggetto Actvity
- di solito un punto this
nella vostra attività. Tuttavia, si noti che si dovrebbe sempre aggiornare la vista nel thread UI.
Si prega di provare quanto segue:
public static View getLayoutByRes(@LayoutRes int layoutRes,@Nullable ViewGroup viewGroup)
{
final LayoutInflater factory = getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return factory.inflate(layoutRes, viewGroup);
}
TextView tv = (TextView) getLayoutByRes(R.layout.xxx ,Null).findViewById(R.id.editd);