2012-07-16 53 views
0

我有一個自定義控件,它應該像iOS中的Segment Tab控件一樣工作。自定義視圖不顯示在活動中

它有3個textviews和佈局如下:

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


     } 


    } 

其中i的這個自定義視圖添加到佈局的活性如下:

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

但是我在屏幕上看到的是一個空白屏幕..而不是應該顯示的自定義控件。請告訴我我哪裏錯了。

在此先感謝。

回答

1

首先,您不能將子女Views添加到View的子類中,因爲它沒有addView方法。相反,你應該擴展ViewGroup或其中一個子類(如LinearLayoutRelativeLayout等)。

後做到上述的事情你可以簡單的添加瀏覽:

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

的膨脹的佈局實際上是添加到自定義View

現在你沒有看到屏幕上的東西,因爲沒有東西可以看到,你的自定義View是空的。

+0

好吧,現在我們可以通過將控件膨脹到自定義LinearLayout中來添加控件。我如何將自定義的LinearLayout添加到我的活動佈局中?例如。包是包org.xxx.yyy.customcontrol; – 2012-07-16 23:53:45

+0

@ newbie_269如果你的自定義視圖不是內部類,那麼你會寫' Luksprog 2012-07-17 05:58:35