2012-04-22 55 views
4

我有一個簡單的活動及其附帶的main.xml。 main.xml有一個自定義佈局(customLinearLayout)和一個簡單的TextView。自定義佈局也有其自己的佈局文件(linearlayout.xml)和一個簡單的Button。這個佈局是正確的膨脹。如何從膨脹佈局訪問視圖?

linearlayout.xml中的按鈕應更改位於main.xml中的textView的文本,但我無法訪問該textView。我究竟做錯了什麼?我也無法膨脹main.xml。

這裏的customLinearLayout:

public class CustomLinearLayout extends LinearLayout { 

LayoutInflater mInflater; 
View ContainerView; 

Button button1; 
TextView tv; 

public CustomLinearLayout(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

public CustomLinearLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

private void init() { 
    mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ContainerView = mInflater.inflate(R.layout.linearlayout, this, true); 

    button1 = (Button) ContainerView.findViewById(R.id.button1); 

    // trying to get the TextView from main.xml 
    tv = (TextView) ContainerView.findViewById(R.id.textview1); // doesn't work 

    // these tries doesn't work either 
    //tv = (TextView) ContainerView.getRootView().findViewById(R.id.textview); 
    //tv = (TextView) this.getRootView().findViewById(R.id.textview); 
    //tv = (TextView) this.findViewById(R.id.textview); 

    button1.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(tv != null) 
       tv.setText("works"); 
      else 
       Log.d("CustomLinearLayout", "TextView not found"); 
     } 
    }); 
} 
} 

佈局文件(linearlayout.xml):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="press" /> 

</LinearLayout> 

的活動:

public class TestLayoutViewsv2Activity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
} 

該活動的main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<test.layoutviewsv2.CustomLinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/textview1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

回答

2

方法findViewById是作用域 - 你的自定義視圖是在自己的內部尋找一個不存在的文本字段。但沒關係!你的觀點應該是他們自己的小世界 - 他們不應該需要了解世界以外的任何事情。可悲的是,你必須改變你的設計來適應這種情況(比如可能會回調一下這個活動),以使其達到你想要的水平。

+1

謝謝你的回答!我想我的想法是錯誤的。我認爲這些視圖會在膨脹後加入main.xml,以便我可以回到層次結構。我想我必須閱讀使用回調然後。是否有任何其他方式讓視圖知道另一個視圖已經改變? (例如,告訴按鈕切換回初始狀態,當另一個視圖或課程完成他的工作) – user1349812 2012-04-22 22:23:22

+0

@ user1349812 nope,這幾乎是唯一的方法 - >您的活動管理其所有視圖的狀態。就像我說的那樣,這個觀點存在於它自己的小世界中 - 它可以告訴母親發生了什麼事情,母親的工作是根據所收到的信息確保所有相關的其他觀點發生變化 – JRaymond 2012-04-23 00:36:02

+0

但是不會意思是說,只有一個控制所有UI的層次結構層?爲了避免重載的Activity,將UI分解成一些ViewGroups的想法如何?這是如何處理的? - 最後一個問題我保證:) – user1349812 2012-04-23 08:42:41

0

您正在以錯誤的方式使用膨脹方法..如果您正在擴展視圖,則沒有必要擴充佈局。膨脹方法用於初始化新視圖,而無需自己創建新實例。我沒有得到你正在做的事情,但你可以使用包含來重用你的一些佈局。檢查這個更多的信息http://developer.android.com/resources/articles/layout-tricks-merge.html

+0

是的,這只是我的實際問題的一個簡單例子。我只想讓視圖知道另一個視圖已經改變了它的狀態(比如告訴一個激活的按鈕切換回初始狀態,當另一個視圖或類完成它的工作時)。隨着膨脹,我認爲我可以訪問放入佈局的視圖,以便我可以通過編程獲得它們的狀態。 – user1349812 2012-04-22 22:46:41