1

我一直在嘗試一段時間,以瞭解如何動態創建一個帶有多個視圖的RelativeLayout(例如TextView,ProgressBar)LinearLayout,以便在每一個之後創建一個RelativeLayout按鈕點擊。請任何人都可以看看我的代碼,看看我能做些什麼來解決這個問題。在Android中動態添加一個RelativeLayout到一個LinearLayout

下面是代碼:

activity_test_container.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/frag1ScrollView"   
android:layout_width="fill_parent" 
android:layout_height="wrap_content" > 

<LinearLayout 
android:id="@+id/testLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".TestContainerActivity" > 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/testContainerTextView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/testContainerTextView1" 
     android:layout_marginBottom="16dp" 
     android:text="TextView2" /> 

    <TextView 
     android:id="@+id/testContainerTextView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="TextView1" /> 

    <Button 
     android:id="@+id/testContainerButton1" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/testContainerTextView2" 
     android:text="Button" /> 
</RelativeLayout> 

</LinearLayout> 

</ScrollView> 

container.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/containerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:paddingBottom="10dp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:layout_marginBottom="16dp" 
    android:background="@color/display_panels" > 

<ProgressBar 
    android:id="@+id/containerProgressBar1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_toLeftOf="@+id/containerImageButton2" 
    android:max="100" 
    android:progress="40" /> 

<TextView 
    android:id="@+id/containerTextView4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/containerTextView6" 
    android:layout_alignLeft="@+id/containerProgressBar1" 
    android:text="" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/containerTextView6" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/containerProgressBar1" 
    android:layout_centerHorizontal="true" 
    android:text="" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<ImageButton 
    android:id="@+id/containerImageButton2" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/containerTextView6" 
    android:background="@color/display_panels" 
    android:contentDescription="Okay icon" 
    android:src="@drawable/ic_green_ok" /> 

</RelativeLayout> 

TestContainerActivity.java

public class TestContainerActivity extends Activity implements OnClickListener { 

LinearLayout containerLayout; 
Button testButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test_container); 

    testButton = (Button)findViewById(R.id.testContainerButton1); 
    containerLayout = (LinearLayout)findViewById(R.id.testLayout); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.test_container, menu); 
    return true; 
} 


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

     createNewLayout(); 

    } 
} 

public void createNewLayout(){ 

     LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View addView = layoutInflater.inflate(R.layout.container, null); 

     containerLayout.addView(addView); 

} 

} 

回答

2

我不完全知道是什麼你是親blem是,但我懷疑這是行沒有出現,因爲我沒有看到你將該監聽器附加到Button的位置。要處理點擊事件,需要在視圖上設置OnClickListener。雖然這通常是使用按鈕完成的,但OnClickListeners可以設置在任何視圖上,因此任何大小/形狀小部件都可以點擊。這是通過View的setOnClickListener方法完成的。有多種方法可以做到這一點,請嘗試修改您的onCreate這樣的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test_container); 

    testButton = (Button)findViewById(R.id.testContainerButton1); 
    containerLayout = (LinearLayout)findViewById(R.id.testLayout); 

    testButton.setOnClickListener(this); 
} 

的另一種方法來設置你的聽衆將是onCreate創建監聽器,而不是使用活動:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test_container); 

    testButton = (Button)findViewById(R.id.testContainerButton1); 
    containerLayout = (LinearLayout)findViewById(R.id.testLayout); 

    testButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      createNewLayout(); 
     } 
    }); 
} 

在這種情況下,你不需要讓你的Activity實現OnClickListener。我通常只會做類似這樣的事情,如果我有許多具有類似功能的按鈕,爲每個按鈕創建偵聽器都會導致性能下降。對於這樣的更偏僻的案例,我更喜歡設置單獨的聽衆,因爲性能差異可以忽略不計,但這只是我個人的偏好。

希望這會有所幫助!如果你的問題實際上是在其他地方,請修改你的問題,我會盡我所能協助!另外,請記住,您可以使用the Log class在LogCat輸出中發佈有關執行的信息。它真的幫助調試!我懷疑,如果你現在將一些日誌記錄在你的監聽器中,並且你會發現日誌記錄不會發生,因爲這些方法從未被調用過。

+0

工作感謝你!我不能相信我沒有意識到我沒有添加聽衆,但是在編輯時我一定會意外地刪除它。容器的大小仍然存在問題。當我添加它們並且我可以添加儘可能多的按鈕點擊時,'layout_marginBottom =「16dp」'和'layout_height =「80dp」'都不在container.xml中工作。你有任何想法,爲什麼這可能是?非常感謝您的幫助! –

+0

我剛剛修復了高度問題,但'layout_marginBottom =「16dp」'仍然無法正常工作。 –

+0

我想通了,它不得不是'paddingBottom'。 –

相關問題