Android: Custom view from xml layout

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

I need 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 correct height and width (a ScrollView , the list of which has exactly the expected length and scrollbars), but they are empty (black), although the xml layout contains many 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 a custom view to my main view:

Doesn't work (what am I trying to achieve):

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

My current solution (works, but doesn't use a 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); 
+4
source share
2 answers

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

try <packageName.ClassName i.e. something like <com.example.CustomView

+2
source

You may need to set the Parallel Layouts of your TweetView.

 LinearLayout.LayoutParams fieldparams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); ctweet.setLayoutParams(fieldparams); 
0
source

All Articles