2013-02-19 156 views
0

我有一個自定義的視圖類從視圖擴展,我想在活動中使用它,但它不顯示任何內容。它沒有運行錯誤,但黑屏沒有輸出。我的代碼如下:自定義視圖不顯示

public class MoveableMenuLayout extends View { 


    public MoveableMenuLayout(Context context, AttributeSet attrs) { 

     super(context, attrs); 
     LinearLayout ll = new LinearLayout(context); 
     ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     TextView tv = new TextView(context); 
     tv.setText("TES_______________"); 
     ll.addView(tv); 

     this.invalidate(); 
     this.requestLayout(); 
    } 

    public MoveableMenuLayout(Context context) { 
     super(context); 

     LinearLayout ll = new LinearLayout(context); 
     ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     TextView tv = new TextView(context); 
     tv.setText("TES_______________"); 
     ll.addView(tv); 

     this.invalidate(); 
     this.requestLayout(); 

    } 
} 

呼叫Activity

public class TestActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MoveableMenuLayout layout = new MoveableMenuLayout(this); 
     setContentView(layout); 
    } 
} 

我已經將其包含在XML佈局,但仍然沒有輸出試過。我不確定我做錯了什麼。我不想改變我希望它成爲一個單獨的類的風格,我知道我可以使用xml佈局並直接在帶有setcontentview的Activity中進行設置,但我不想那樣做。謝謝

+0

首先創建的線性佈局不會被添加到任何視圖中。而且你也不能添加任何其他視圖到簡單的視圖,因爲它不是一個容器。你可以嘗試擴展你的MoveableMenuLayout – Triode 2013-02-19 17:05:12

回答

1

爲什麼它 - 你沒有數據。你創建了一個線性佈局和文本視圖,但它們不是你的孩子。所以你沒有任何數據可以繪製(並且無論如何都沒有重寫onDraw)。

如果要創建一個包含一組其他視圖的自定義視圖,則需要從ViewGroup派生而不是View。您還需要將頂級子視圖添加爲子視圖,而不是將其視爲數據成員。你可能更好的直接從LienarLayout或RelativeLayout派生,並直接從xml給你的孩子充氣。

public class MoveableMenuLayout extends ViewGroup { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    LinearLayout ll = new LinearLayout(context); 
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    ll.addView(tv); 
    addView(ll); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    LinearLayout ll = new LinearLayout(context); 
    ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    ll.addView(tv); 
    addView(ll); 

} 

}

可能會工作。您可以通過從LinearLayout派生而將其升級到絕對。然後你不需要有一個內部佈局。就像這樣:

public class MoveableMenuLayout extends LinearLayout { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    addView(tv); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    TextView tv = new TextView(context); 
    tv.setText("TES_______________"); 
    addView(tv); 

} 

}

一個更好的方法是通過XML

public class MoveableMenuLayout extends LinearLayout { 


public MoveableMenuLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(ourlayoutid, this); 
} 

public MoveableMenuLayout(Context context) { 
    super(context); 

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(ourlayoutid, this); 

} 

}

做出來,然後把你想要的孩子在一個XML文件中。在這種情況下,xml文件中的頂級標記應該是一個標記,而不是佈局

+0

的任何ViewGroup,你可以請示例使用視圖組。 – user606669 2013-02-19 17:12:28

+0

偉大的作品。謝謝 – user606669 2013-02-19 17:26:09

0

也嘗試設置textview的佈局參數,因爲您只聲明父級線性佈局的佈局參數,而不是子級textview它不會得到高度和寬度。