2016-03-22 13 views
1

Ich habe ein XML-Element erstellt, das automatisch eine Schaltfläche erstellt, und dann eine ScrollView mit einem LinearLayout. Die Taste, wenn gedrückt, soll die Farbe ändern und die Sichtbarkeit der ScrollView ändern. Im Moment ändert sich nur die Farbe der Schaltfläche, aber der Text in der Bildlaufansicht bleibt sichtbar.kann die Sichtbarkeit von ScrollView nicht festlegen

Dies funktionierte vorher, als ich die Schaltfläche und ScrollView durch XML erstellt und onClickListeners über die onCreate() Methode in der Hauptaktivität erstellt.

mein Code:

public class AccordionWidget extends LinearLayout{ 


    public AccordionWidget(Context c, AttributeSet attrs) { 
     super(c, attrs); 

     final Context context = c; 

     final Button btn = new Button(context); 
     final LinearLayout ll = new LinearLayout(context); 
     final ScrollView sv = new ScrollView(context); 

     TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.accordion); 

     LayoutParams btnparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
     btn.setText(a.getString(R.styleable.accordion_text)); 
     btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_not_pressed)); 
     LayoutParams llparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
     llparams.weight = 1f; 
     LayoutParams swparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 

     btn.setLayoutParams(btnparams); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     ll.setLayoutParams(llparams); 
     sv.setVisibility(View.GONE); 
     sv.setLayoutParams(swparams); 

     this.addView(sv); 
     this.addView(btn); 
     sv.addView(ll); 

     btn.setOnClickListener(new OnClickListener() { 
      boolean btnstate = false; 
      @Override 
      public void onClick(View v) { 
       if (btnstate) { 
        btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_pressed)); 
        sv.setVisibility(View.VISIBLE); 
        btnstate = false; 
       } else { 
        btn.setBackgroundColor(ContextCompat.getColor(context, R.color.button_not_pressed)); 
        sv.setVisibility(View.GONE); 
        btnstate = true; 
       } 
      } 
     }); 

     a.recycle(); 
    } 

}

Antwort

0

Haben Sie versucht, diese beiden Linien Swapping:

sv.setVisibility(View.GONE); 
sv.setLayoutParams(swparams); 

Vielleicht setLayoutParams überschreibt die von setVisibility

+0

versuchte es, scheint nicht einen Unterschied zu machen. Das würde auch nicht erklären, warum es die Sichtbarkeit nicht ändert, wenn ich den Knopf drücke. danke trotzdem – lenny

1

gesetzt Sichtbarkeit Farbe hinzu Hintergrund von sv. Versuchen Sie folgendes:

final ScrollView sv = new ScrollView(context); 
sv.setBackgroundColor(0xffffff);//make it not transparent :) 

Da der Code nicht erwähnt, über den Text so nehme ich an, dass der Text in verschiedenen Schicht des scrollview und wenn scrollview ist oben drauf, indem die bgcolor Einstellung der Text blenden kann .

+0

innerhalb der Bildlaufansicht ist ein lineares Layout, und in der LL sind Textansichten. Ich sehe, was Sie versuchen zu tun, aber für meine Zwecke wird es nicht tun – lenny

+0

Warum versuchen Sie nicht, Sichtbarkeit für die 'LL' zu setzen, um zu sehen, was passiert? oder verschiebe 'boolean btnstate' als globale Variable –

+1

Ich habe bereits versucht, die Sichtbarkeit des LL zu setzen, gleiche Ergebnisse. Ich kann nicht sehen, wie sich der Umfang des Booleans auf das Ergebnis auswirken würde. es ist nur relevant für die if-Anweisung, die funktioniert, da die Schaltfläche bei jedem Drücken der Farbe wechselt. nur die scrollviews Sichtbarkeit ändert sich nicht. – lenny

1

Derzeit setzen Sie die Sichtbarkeit der ScrollView, aber nicht die Sichtbarkeit ihrer Kinder. Sie könnten versuchen, alle Kinder der ScrollView einzeln in this answer gerne gezeigt zu verstecken:

for (int i = 0; i < sv.getChildCount(); i++){ 
    View view = sv.getChildAt(i); 
    view.setVisibility(View.GONE); 
} 

die Idee So ist einfach: die Kinder eins nach dem anderen bekommen und die Sichtbarkeit gesetzt. Natürlich könntest du mehr Sachen mit den Kindern tun, wenn du musst.

+0

Alle Kinder einer Ansicht sind unsichtbar, wenn die Ansicht unsichtbar ist. Es funktionierte vorher, als ich den Button und ScrollView durch XML erstellte und "onClickListeners" durch die 'onCreate()' Methode in der Hauptaktivität erzeugte. – lenny

+0

Was genau meinst du mit "vorher"? Ich verstehe nicht genau, was Sie geändert haben – user187470

+0

Ich ging von der Erstellung der Schaltfläche, Bildlaufansicht und lineares Layout manuell in der XML-Datei, um mein eigenes XML-Element zu erstellen und damit in der Klasse, die Sie oben sehen. – lenny

Verwandte Themen