简体   繁体   中英

Custom linear layout not showing

I am making a custom layout, but it's not showing, and i do not know why.

Here is the XML file where the class is defined

<com.example.name.gw2applicaton.SpecializationView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="65dp"
            android:layout_height="match_parent">

            <Button
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:text="yop2" />

            <Button
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:text="yop2" />

    </LinearLayout>
</com.example.name.gw2applicaton.SpecializationView>

Here is the class, just a constructor

 public class SpecializationView extends LinearLayout {

    public SpecializationView(Context context) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.layout_specialization, this, true);
    }
}

And finally where the class is used

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="horizontal">

     <com.example.name.gw2applicaton.SpecializationView
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical">
      </com.example.name.gw2applicaton.SpecializationView>

        </LinearLayout>
</LinearLayout>

The SpecializationView is not visible, I do not know why. What am I doing wrong here?

That's not how it works for a custom view, as you are trying to do. Use this convention instead:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <!-- just include the layout you defined else where -->
        <include layout="@layout/layout_specialization"/>

    </LinearLayout>

Where layout_specialization.xml is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="65dp"
    android:layout_height="match_parent">

        <Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="yop2" />

        <Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="yop2" />

</LinearLayout>

Note: You should use custom view definitions when you need to modify an existing view or viewgroup to have special programatic functionality, such as positioning, dynamic content, niche widget, etc... When you want to use a view like you are where it is just using existing widget functionality, do as I described. The include xml tag is great for defining an xml layout and re-using it through your project so there is a minimized duplication of code.

EDIT:

The reason you layout is not showing by the way is you have only defined the constructor for programmatically creating a view (via java code, not xml). To allow for an xml definition of your custom view extend the class as follows with the additional constructors needd:

public class SpecializationView extends LinearLayout {

    /* Programmatic Constructor */
    public SpecializationView(Context context) {
        super(context);
        init(context, null, 0);
    }

    /* An XML Constructor */
    public SpecializationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    /* An XML Constructor */
    public SpecializationView(Context context, AttributeSet attrs, int resId) {
        super(context, attrs, resId);
        init(context, attrs, resId);
    }

    /** 
    * All initialization happens here!
    */
    private void init(Context context, AttributeSet attrs, int resId){
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.layout_specialization, this, true);
    }
}

This definition now includes the xml ability to create the custom view (which should now probably work for you). The reason it will work is now you send the attribute set, or the attributes definied via xml to the constructor. Since you didn't include it, it doesn't know what to do for your custom view when defined in xml and you cannot access the layout's attributes that you may define as custom.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM