Costruzione di una customview in android.
L'avevo vista e capita, e poi ho scordato praticamente tutto.
Ho un file xml che ho chiamato my_view.xml, e un file java che ho chiamato myView.java.
Analizziamo questo file.
public class MyView extends RelativeLayout {
TextView testo1;
TextView testo2;
public MyView(Context context) {
super(context);
initView(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context){
inflate(context,R.layout.my_view,this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
testo1=(TextView)findViewById(R.id.testo1);
testo2=(TextView)findViewById(R.id.testo2);
this.setBackgroundColor(Color.CYAN);
}
public void saluta(){
testo1.setText("BUONGIORNO");
testo2.setText("BUONASERA");
}
}
Le variaabili dichiarate a livello di classe sono due variabili oggetto per le due TextView che saranno contenute nella view, ossia testo1 e testo2.
public class MyView extends RelativeLayout {
TextView testo1;
TextView testo2;
Quindi vengono chiamati tutti i costruttori della classe genitore RelativeLayout.
public MyView(Context context) {
super(context);
initView(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
In tutti e tre i costruttori viene chiamato il metodo initView.
Il metodo initView è questo:
private void initView(Context context){
inflate(context,R.layout.my_view,this);
}
in pratice quello che "inflata" il layout specificato in xml entro questo oggetto.
Quindi c'è onFinishInflate, che dovrebbe essere il metodo che entra in azione una volta che l'"inflatazione" sia terminata, in modo che alle variabili oggetto vengano attribuite le views presenti nell'xml.
@Override
protected void onFinishInflate() {
super.onFinishInflate();
testo1=(TextView)findViewById(R.id.testo1);
testo2=(TextView)findViewById(R.id.testo2);
this.setBackgroundColor(Color.CYAN);
}
Una volta terminata l'inflatazione, si possono creare i metodi, come appunto questo:
public void saluta(){
testo1.setText("BUONGIORNO");
testo2.setText("BUONASERA");
}
Il file xml è così:
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/testo1"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginTop="100dp"
android:layout_marginStart="100dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/testo2"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginTop="150dp"
android:layout_marginStart="100dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
Il tutto va poi inserito in un'applicazione:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.example.antonello.studiocustomview.MyView
android:id="@+id/myView"
android:layout_width="200dp"
android:layout_height="200dp" />
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyView myView = (MyView)findViewById(R.id.myView);
myView.saluta();
}
}
Ecco, adesso credo di aver rinfrescato a sufficienza il modo di creare delle CustomViews.