2016-05-01 6 views
0

Ich versuche, eine einfache Anwendung zu machen, wo nur eine Schaltfläche zunächst angezeigt wird. Was ich tun möchte, ist, wenn der Benutzer darauf klickt, eine andere (klickbare) Schaltfläche darunter erscheint. Ich habe mit diesem Code versucht, aber es scheint nicht zu funktionieren (es gibt eine NullPointerException) ... und Internet konnte nicht helfen. Hier ist meine XML-Code:Dynamisch Schaltflächen in einem ListView erstellen [Android]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffc1c1" 
    android:orientation="vertical"> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="0dp" 
     android:id="@+id/add" 
     android:text="add button" 
     android:paddingStart="@dimen/activity_horizontal_margin"/> 
    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/listView"> 
    </ListView> 
</LinearLayout> 

.. und hier ist mein Java-Code:

public class ListButtonActivity extends AppCompatActivity { 

    private ListView listView; 
    private Button add; 
    private Button b1, b2, b3; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 

     add = (Button) findViewById(R.id.add); 
     final Button[] statesList = {b1,b2,b3}; 
     b1 = add; 
     b2 = add; 
     b3 = add; 
     add.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listView = (ListView) findViewById(R.id.listView); 

       ArrayAdapter<Button> adapter = new ArrayAdapter<Button>(chatActivity.this, 
         android.R.layout.simple_list_item_1, android.R.id.text1, statesList); 
       listView.setAdapter(adapter); 
      } 
     }); 

    } 

} 

Antwort

0

U're für zu wenig zu mucho machen. entfernen Sie einfach die Listenansicht aus Ihrem Layout. Fügen Sie stattdessen eine weitere Schaltfläche hinzu, ändern Sie jedoch die Sichtbarkeit in false. Und wenn der Benutzer auf die Schaltfläche klickt, seine Sichtbarkeit auf true

-Layout ändern:

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

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="My Button1" 
    android:onClick="btn1Clicked" 
    android:id="@+id/button" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="My second Button" 
    android:visibility="invisible" 
    android:id="@+id/button2" /> 
</LinearLayout> 

Und Ihre Aktivität:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void btn1Clicked(View view){ 
    Button btn2 = (Button) findViewById(R.id.button2); 
    btn2.setVisibility(View.VISIBLE); 
} 

Aber wenn Sie einen Listview verwenden müssen, müssen Sie tu Verwenden Sie einen CustomAdapter anstelle von

android.R.layout.simple_list_item_1 //this is predefined for textonly listviews 
+0

Das ist nicht genau das, was ich versucht habe ... Ich möchte, dass der Benutzer so viele Buttons hinzufügt, wie er möchte. Ich kann die Anzahl der Knöpfe, die er fragt, nicht vorhersehen und ich möchte auch keine tausend Knöpfe im Javacode erstellen. Denkst du, dass es eine Lösung dafür gibt? – mwstudingi

0

Sie müssen ein neues Element zu 0 hinzufügen. Danach müssen Sie dem Adapter zeigen, dass Sie ein neues Element hinzugefügt haben.

Dafür verwenden Sie einfach die Methode notifyDataSetChanged() in Adapter und Sie werden ein neues Element hinzugefügt haben.

+0

Könnten Sie sich bitte entwickeln? Ich fügte statesList eine Schaltfläche mit einer append-Methode hinzu und schrieb "adapter.notifyDataSetChanged();" Nach der Definition des Adapters, aber der Emulator gibt mir eine NullPointerException. Es sagt, dass ich versuche, eine toString für eine Null-Objektreferenz aufzurufen – mwstudingi

0

Ok. Noch keine Notwendigkeit für eine Listview, ListView ist ein wenig komplex für neue Benutzer. fügen Sie einfach dieses Layout:

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

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Create New Button" 
    android:onClick="createBtnClicked" 
    android:id="@+id/button2" /> 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/scrollView" > 

    <LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/ll_btns" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    </LinearLayout> 
</ScrollView> 

Und auf Ihrem MainActivity.java:

public class MainActivity extends AppCompatActivity { 
LinearLayout ll; 
int cont=0; 

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

    ll = (LinearLayout) findViewById(R.id.ll_btns); 

} 

public void createBtnClicked(View v){ 
    Button btn = new Button(this); 
    btn.setText("tbn "+cont++); 
    ll.addView(btn); 
} 

Es .. Sie können können so viele Tasten wie Android-Speicher hinzufügen unterstützen.

Verwandte Themen