Come si passa all'attuale AttributeSet a una classe di visualizzazione personalizzata? Se utilizzo un costruttore che ha solo Context negli argomenti, perdo tutti i temi e la possibilità di utilizzare i tag "style" nell'xml per quella visualizzazione personalizzata.Come passare AttributeSet alla vista personalizzata
Quello che ho fatto è creare un'attività che contenga la mia vista personalizzata già nel file xml, quindi crearne una nuova a livello di codice e aggiungerla al layout. Quello che trovo è quello che è fatto nel xml ha lo stile corretto, e quello che creo programmaticamente non lo fa.
La differenza tra i due per quanto posso dire è che il sistema utilizza il costruttore CustomLayout1(Context context, AttributeSet attrs)
. Il problema è che non riesco a capire come ottenere AttributeSet affinché l'applicazione passi a questa visualizzazione personalizzata quando la creo a livello di programmazione.
Ecco l'Activity:
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
public class ThemeOne extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layout = (LinearLayout) findViewById(R.id.mainlayout);
layout.addView(new CustomLayout1(getApplicationContext()));
}
}
Ecco il xml principale:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/mainlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.clearsync.test.theme1.CustomLayout1 android:id="@+id/maincustom"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
La classe visualizzazione personalizzata:
import com.clearsync.test.theme1.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
public class CustomLayout1 extends LinearLayout {
private Context context = null;
public CustomLayout1(Context context) {
super(context);
this.context = context;
create();
}
public CustomLayout1(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
create();
}
private void create(){
LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.inflateme, this, true);
}
}
e, infine, la visualizzazione personalizzata xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Oh, Hewroh..."
style="?textview_style1" />
</LinearLayout>
Semplice. Elegante. Grazie. Avrei dovuto pensarci anch'io :-P Questo è un comportamento terribilmente fastidioso che mi piacerebbe vedere risolto. Ho implementato questa soluzione nel mio codice principale e, naturalmente, ho scoperto una serie di altri problemi correlati. Sembra un bug che il tema e lo stile sarebbero semplicemente scomparsi così misteriosamente semplicemente per il modo in cui si chiama una vista personalizzata. * sigh * – atraudes
[Ecco un esempio più completo di utilizzo di un Inflater layout per copiare una visualizzazione personalizzata.] (http://stackoverflow.com/a/41500409/3681880) – Suragch