Android: Custom view from xml layout

17,098

you can use this in your xml just like any other view like <TextView

try <packageName.ClassName ie something like <com.example.CustomView

Share:
17,098
Toast
Author by

Toast

Updated on June 04, 2022

Comments

  • Toast
    Toast almost 2 years

    i would like to create a custom View (subclass of the View class) and use a layout xml resource.

    I want something like this:

    public class CustomView extends LinearLayout {
    
        public CustomView(Context context) {
              super(context);
              LayoutInflater  mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              mInflater.inflate(R.layout.tweet, this, true);
    }
    

    This actually creates a View with the right height and width (a ScrollView with a list of those has exactly the expected length and scrollbars) but they are empty (black) even though the xml layout contains a lot of TextViews.

    This is my xml layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/tweet"
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:orientation="vertical"
        android:background="#ffffff">
        <RelativeLayout
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
            <LinearLayout 
                android:layout_height="wrap_content" 
                android:layout_width="match_parent" 
                android:orientation="horizontal"
                android:background="#ffffff">
                <TextView 
                    android:text="User" 
                    android:id="@+id/tvusername" 
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content"
                    android:textColor="#000000"
                    android:textStyle="bold">
                </TextView>
                <View
                    android:layout_width="5dip"
                    android:layout_height="1dip">           
                </View>
                <TextView 
                    android:text="userscreenname" 
                    android:id="@+id/tvuserscreenname" 
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content">
                </TextView>    
            </LinearLayout>
            <TextView
                android:text="0s"
                android:id="@+id/tvtime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true">
            </TextView>
        </RelativeLayout>
        <TextView 
            android:text="Tweet Content" 
            android:id="@+id/tvcontent" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:textColor="#000000">
        </TextView>
        <View 
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#ffffff">
        </View>
        <TextView 
            android:text="Retweet by" 
            android:id="@+id/tvrtby" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content">
        </TextView>
    </LinearLayout>
    

    This is my main layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        >
    
    <ScrollView 
        android:layout_height="match_parent" 
        android:layout_width="match_parent" 
        android:id="@+id/scrollView1" 
        android:orientation="vertical"
       android:layout_alignParentTop="true">
        <LinearLayout 
            android:layout_width="match_parent" 
            android:id="@+id/timeline" 
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="#ffffff">           
                <TextView  
                android:id="@+id/tvoutput"
                android:layout_width="match_parent" 
                android:layout_height="wrap_content" 
                android:text="@string/hello"
                />    
        </LinearLayout>
    </ScrollView>
    </LinearLayout>
    

    This is how I add the custom view to my main view:

    Not working (what I try to achieve):

    TweetView ctweet = new TweetView(getApplicationContext(),tweet);
    timeline.addView(ctweet);
    

    My current solution (works, but uses no custom view):

                View vtweet = View.inflate(getApplicationContext(), R.layout.tweet,null);
    
                TextView tvusername = (TextView) vtweet.findViewById(R.id.tvusername);
                TextView tvuserscreenname = (TextView) vtweet.findViewById(R.id.tvuserscreenname);
                TextView tvcontent = (TextView) vtweet.findViewById(R.id.tvcontent);
                TextView tvtime = (TextView) vtweet.findViewById(R.id.tvtime);
    
                tvusername.setText(tweet.getUser().getName());
                tvuserscreenname.setText('@' + tweet.getUser().getScreenName());
                tvcontent.setText(tweet.getText()); 
                //tvtime.setText(ctweet.tvtime.getText()); 
                timeline.addView(vtweet);
    
  • Toast
    Toast almost 12 years
    How can I use it to make a class out ouf it?