2012-01-18 51 views
1

我有一個自定義的ViewGroup(藍色背景),當在應用程序的生命週期中某個時候觸摸時,我想添加一個任意的xml定義的視圖佈局在前景中)到該自定義視圖。在運行時動態添加一個xml定義的佈局onCreate()

有沒有辦法在活動的onCreate之外做到這一點?

whitebox.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:background="#FFFFFF" 
    android:orientation="vertical" > 
</LinearLayout> 

TestDynamicLayoutActivity.java

package net.lapasa.testdynamiclayout; 

import android.app.Activity; 
import android.os.Bundle; 

public class TestDynamicLayoutActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(new MyCustomViewGroup(this)); 
    } 
} 

MyCustomViewGroup.java

package net.lapasa.testdynamiclayout; 

import java.lang.annotation.Target; 

import android.content.Context; 
import android.graphics.Color; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 

public class MyCustomViewGroup extends ViewGroup 
{ 

    private Context context; 

    public MyCustomViewGroup(Context context) 
{ 
    super(context); 
    this.context = context; 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) 
{ 
    this.setBackgroundColor(Color.BLUE); 

} 

@Override 
public boolean onTouchEvent (MotionEvent event) 
{ 
    if (event.getAction() == MotionEvent.ACTION_DOWN) 
    { 
     View whiteBoxView= LayoutInflater.from(context).inflate(R.layout.whitebox, this); 
     ViewGroup targetParent = (ViewGroup) whiteBoxView.getParent(); 
     targetParent.removeView(whiteBoxView); 
     this.addView(whiteBoxView); 
    } 
    return true; 
} 
} 

的代碼在ACTION_DOWN該塊沒有做幹啥g除了呈現黑屏=(發生什麼事了?

+0

您確保佈局 - 需要延長的ViewGroup - 你想添加到有一個ID。那麼當你想稍後添加某些東西時,可以用layoutInflater(即getSystemService(Context.layoutInflator);並手動添加你想要的。 – L7ColWinters 2012-01-18 18:23:28

+0

這不是我在onTouchEvent()裏面已經做的事嗎? – 2012-01-18 18:25:33

+0

對不起,我只是調試你的代碼,以確保layoutinflater設置正確。我從未使用.from – L7ColWinters 2012-01-18 18:45:56

回答

1

我有沒有這樣做 - 你只是想擁有一些藍色視圖,其中包含一個白色的視圖,當點擊藍色視圖時顯示該視圖?

那麼最好不要實施自己的ViewGroup,而應該使用現有的FrameLayout之一。將佈局的背景設置爲藍色。添加一個兒童View,將其背景設置爲白色,並將其可見性設置爲View.INVISIBLEView.GONE

ViewGroup添加點擊處理程序,將白色View的可見性設置爲View.VISIBLE

你可以做這樣的:

的main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 

      android:background="#00f" 
      android:onClick="onBlueClick" 

      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
    <View android:id="@+id/whiteBox" 
     android:background="#fff" 
     android:visibility="gone" 

     android:layout_gravity="center" 
     android:layout_width="20dp" 
     android:layout_height="20dp"/> 
</FrameLayout> 

MyActivity.java:

package com.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 

public class MyActivity extends Activity { 

    private View whiteBox; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    whiteBox = findViewById(R.id.whiteBox); 
    } 

    @SuppressWarnings({"UnusedDeclaration"}) // wired by layout xml 
    public void onBlueClick(final View view) { 
    if (whiteBox != null) { 
     whiteBox.setVisibility(whiteBox.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE); 
    } 
    } 
} 
+0

我定義的規定之一是它必須在onCreate()之外;功能上,但工作,但創建活動,我想執行懶惰的實例化。在你的例子中,無論是否使用白盒,它都被加載。 – 2012-01-18 19:57:26

+0

然後你可以使用'ViewStub':http://developer.android.com/reference/android/view/ViewStub。html – Oderik 2012-01-19 08:56:57

+0

在運行時你應該沒有任何問題改變你的視圖hirarchy(儘管你必須確保在UI線程上做你的修改)。我認爲你的例子不起作用,因爲你是從'ViewGroup'派生的,它只是一個不真正佈置它的子視圖的存根。如果你真的想用一個自定義的'ViewGroup'來改變背景顏色,可以從實際處理佈局的一個派生出來。 – Oderik 2012-01-19 09:05:28

0

添加新視圖後嘗試撥打電話invalidate()。可能您必須重寫layout()measure()draw()創建完整自定義視圖的方法。

+0

嘗試invalidate()。不起作用。如果我覆蓋我的自定義視圖組的佈局,度量和繪製,我到底會做什麼? – 2012-01-18 18:49:52

+0

http://developer.android.com/reference/android/view/View.html這裏是說明你應該如何實現自定義視圖 – Jin35 2012-01-19 03:35:50

+0

Thx Jin35,這真的很有幫助。 – 2012-01-19 13:57:02

相關問題