web-dev-qa-db-fra.com

Gonfler une disposition xml dans une classe View personnalisée

J'ai un cours View1 qui étend View. Je veux gonfler R.layout.test2.xml dans cette classe View1. J'ai mis un code suivant dans cette classe

public class View1 extends View {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view=mInflater.inflate(R.layout.test2, null, false);
    }
}

À partir d'une autre classe Home Je souhaite que cette vue gonflée soit présente dans certaines circonstances. Dans la classe Home, j'ai écrit le code suivant:

public class Home extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        CreateView();   
    }

    public void CreateView() {
        LinearLayout lv=(LinearLayout)findViewById(R.id.linearlayout);
        View1 view = new View1(Home.this);
        lv.addView(view);
    }
}

Mais pendant que je dirige mon projet, l'activité ne me montre rien.

35
LuminiousAndroid

Vous ne pouvez pas ajouter de vues à la classe View à la place, vous devez utiliser ViewGroup ou l'une de ses sous-classes (comme Linearlayout, RelativeLayout etc). Ensuite, votre code sera comme ceci:

public class View1 extends LinearLayout {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mInflater.inflate(R.layout.test2, this, true);}}

Aussi la ligne:

mInflater.inflate(R.layout.test2, null, false)

n'ajoute rien à la vue actuelle (à cause du paramètre false), il gonfle juste un View à partir d'une disposition xml.

50
Luksprog

Utilisez ceci

    LayoutInflater li = (LayoutInflater)getContext().getSystemService(infService);
    li.inflate(R.layout.test2, **this**, true);

Vous devez utiliser this, et non null, et changer le paramètre false (booléen AttachToRoot) en true

11
Aracem

Utilisez le code ci-dessous pour gonfler votre mise en page, puis vous pouvez utiliser cette vue à n'importe quelle fin. Cela vous donnera la disposition la plus parent de votre fichier XML. Tapez cast et utilisez-le en conséquence.

View headerView = View.inflate(this, R.layout.layout_name, null);
3
Bharat Sharma

Vous devez utiliser un ViewGroup comme FrameLayout et faire:

public class View1 extends FrameLayout {

    public View1(Context context) {
        super(context);
        inflate(context, R.layout.view1, this);
    }
}

Dans le XML de mise en page, utilisez le <merge tag pour non seulement ajouter votre view1 disposition à la disposition racine, ce qui signifie que nous avons un FrameLayout vide et votre vue définie côte à côte.

<?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:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:text="content" />

</merge>

Voir http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/

1
Marius

Vous ajoutez dans la vue vide de l'activité à domicile. Parce que dans la classe View1, vous n'avez qu'à gonfler la vue mais pas à en ajouter n'importe où.

1
d.k.