0

我有一个自定义控件,它应该像 iOS 中的 Segmenttab 控制器一样工作。

它有 3 个文本视图,布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/groupofthree"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/background"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_1"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="@color/black"
        android:gravity="center"
        android:text="Retiree"
        android:textColor="@color/whitetext"
        android:textSize="15dp"
        android:textStyle="normal" />

    <TextView
        android:id="@+id/tv_2"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="@color/lightGrey"
        android:gravity="center"
        android:padding="3dp"
        android:text="Under18/fulltime"
        android:textColor="@color/whitetext"
        android:textSize="15dp"
        android:textStyle="normal" />

    <TextView
        android:id="@+id/tv_3"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="@color/black"
        android:gravity="center"
        android:text="Others"
        android:textColor="@color/whitetext"
        android:textSize="15dp"
        android:textStyle="normal" />

</LinearLayout>

控件如下所示:

    public class SegmentedRadioGroup extends View{

        private Context m_Context;

        public TextView tv1;
        public TextView tv2;
        public TextView tv3;
        int selectedIndex = 0;

        public SegmentedRadioGroup(Context context, AttributeSet attrs) {

            super(context, attrs);
            m_Context = context;

        }

        public SegmentedRadioGroup(Context context, AttributeSet attrs, int defStyle) {

            super(context, attrs, defStyle);
        }

        public SegmentedRadioGroup(Context context) {
            super(context);
            // TODO Auto-generated constructor stub

            m_Context = context;
            LayoutInflater inflater = (LayoutInflater) m_Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = inflater.inflate(R.layout.threeradiobutton, null);


            v.isInEditMode();
            tv1 = (TextView) v.findViewById(R.id.tv_1);
            tv2 = (TextView) v.findViewById(R.id.tv_2);
            tv3 = (TextView) v.findViewById(R.id.tv_3);

            tv1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    selectedIndex = 0;
                    tv1.setBackgroundColor(R.color.darkgrey);
                    tv2.setBackgroundColor(R.color.lightGrey);
                    tv3.setBackgroundColor(R.color.lightGrey);
                }
            });

            tv2.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    selectedIndex = 1;
                    tv1.setBackgroundColor(R.color.lightGrey);
                    tv2.setBackgroundColor(R.color.darkgrey);
                    tv3.setBackgroundColor(R.color.lightGrey);

                }
            });

            tv3.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    selectedIndex = 2;

                    tv1.setBackgroundColor(R.color.lightGrey);
                    tv2.setBackgroundColor(R.color.lightGrey);
                    tv3.setBackgroundColor(R.color.darkgrey);
                }
            });
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);


        }


    }

我将此自定义视图添加到布局的活动如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/background"
        android:orientation="vertical" >

        <RelativeLayout
            android:id="@+id/widget1216"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/appspecific_menubar" >

            <TextView
                android:id="@+id/widget1222"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="@string/transaction_accounts_topbar"
                android:textColor="@color/whitetext"
                android:textSize="18sp"
                android:textStyle="bold" >
            </TextView>

            <ImageButton
                android:id="@+id/home_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:background="@null"
                android:paddingBottom="5dip"
                android:paddingLeft="10dip"
                android:paddingTop="5dip"
                android:src="@drawable/home" >
            </ImageButton>
        </RelativeLayout>
    <LinearLayout 
        android:id="@+id/testLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />.
     </LinearLayout>

活动看起来像这样。我已使用 addview 将视图添加到布局中。

    public class TransactionAccount extends Activity {
        LinearLayout selector;
        SegmentedRadioGroup sg_test;
        LayoutInflater inflater;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.transactionaccount_main);
            selector = (LinearLayout)findViewById(R.id.testLayout);




            sg_test = new SegmentedRadioGroup(this);
            selector.addView(sg_test);



    //      inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    //      selector = inflater.inflate(R.id., null);

    //      sg_test = new SegmentedRadioGroup(this);

    //      sg_test.tv1.setText("1");
    //      sg_test.tv2.setText("2");
    //      sg_test.tv3.setText("3");
    //      sg_test.tv1.setBackgroundColor(R.color.blacktext);
    //      sg_test.setVisibility(View.VISIBLE);
    //      
    //      Log.d("TransactionAccount", "onCreate++++++" + sg_test.tv1.getText());
    //      Log.d("TransactionAccount", "onCreate++++++" + sg_test.tv2.getText());
    //      Log.d("TransactionAccount", "onCreate++++++" + sg_test.tv3.getText());
        }
    }

但我在屏幕上看到的是一个空白屏幕.. 而不是应该显示的自定义控件。请告诉我我哪里出错了。

提前致谢。

4

1 回答 1

1

首先,您不能将子类添加Views到子类中,View因为它没有该addView方法。相反,您应该扩展ViewGroup或其子类之一(如LinearLayoutRelativeLayout)。

完成上述操作后,您可以简单地添加视图:

View v = inflater.inflate(R.layout.threeradiobutton, this, true);

将膨胀的布局实际添加到自定义View.

现在你在屏幕上看不到任何东西,因为没有东西可看,你的自定义View是空的。

于 2012-07-16T09:39:00.783 回答