安卓:从XML布局定义视图(Android: Custom view from xml layout

2019-09-19 15:22发布

我想创建一个自定义View (的子View类),并使用一个布局XML资源。

我想是这样的:

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);
}

这实际上将创建一个View与合适的高度和宽度( ScrollView与列表具有完全相同的预期长度和滚动条),但它们是空的(黑色),即使XML布局中含有大量的TextViews

这是我的XML布局:

<?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>

这是我的主要布局:

<?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>

这是我的自定义视图添加到我的主要观点:

不工作(我尽量做到):

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

我当前的解决方案(工作,但不使用自定义视图):

            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);

Answer 1:

你可以在你的XML使用这个就像就像任何其他视图<TextView

尝试<packageName.ClassName即像<com.example.CustomView



Answer 2:

也许你必须设置你TweetView对象的布局PARAMS。

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


文章来源: Android: Custom view from xml layout