2012-06-27 5 views
15

Ich versuche, ein paar versteckte Tasten (mit setVisibility(View.VISIBLE), innerhalb einer RelativeLayout) zu zeigen, aber es funktioniert nicht immer. Die Schaltfläche zeigt OK auf einem Galaxy Tab 10.1 "aber nicht in einem kleineren Tablet (nicht sicher, welches Modell), noch auf einem Android 4.0-Emulator.setVisibility (View.VISIBLE) funktioniert nicht immer. Ideen?

Ich zufällig festgestellt, dass für eine bestimmte TextView t, der folgende Code die Schaltflächen verursacht sichtbar werden:

t.setText(t.getText()); 
... 
button.setVisibility(View.VISIBLE); 

t im gleichen RelativeLayout liegt aber nicht auf die Tasten im Zusammenhang (ihre Standorte sind unabhängig und nicht-überlappende)

bearbeiten. bei einigen Android Entwickler will um das zu verfolgen ...

Ich konnte den Code auf das folgende Layout reduzieren, das das Problem auf einem Android 4.0.3-Emulator, aber kein Galaxy Tab zeigt. Ich habe festgestellt, dass ich eine SurfaceView oder das Problem nicht auftritt (zum Beispiel, ändern Sie es zu TextView und das Problem verschwindet).

<?xml version="1.0" encoding="utf-8"?> 
<!-- layout/test.xml --> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:id="@+id/relativeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <SurfaceView 
     android:id="@+id/mapCtrl" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/bottomPanel" 
     android:text="Placeholder" 
     android:layout_marginTop="18dip" /> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="@string/map_mode_title" /> 

    <!--=================================================--> 
    <!-- Bottom bar: current road name and current speed --> 
    <LinearLayout 
     android:id="@+id/bottomPanel" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:background="#f228" 
     android:orientation="horizontal" 
     android:textColor="#ffff" > 
     <Button 
      android:id="@+id/btnNavMode" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_marginRight="3dip" 
      android:textColor="#fff" 
      android:text="Switch to\nNav Mode" /> 
     <RelativeLayout 
      android:id="@+id/currentStreetPanel" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:clickable="true" 
      android:orientation="vertical" > 
      <TextView 
       android:id="@+id/currentStreetHdg" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:text="Current street" 
       android:textColor="#fff" 
       android:textSize="10dip" /> 
      <TextView 
       android:id="@+id/currentStreet" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_below="@+id/currentStreetHdg" 
       android:layout_marginTop="-8dip" 
       android:singleLine="true" 
       android:text="Current street" 
       android:textColor="#fff" 
       android:textSize="30dip" /> 
     </RelativeLayout> 
     <RelativeLayout 
      android:id="@+id/RelativeLayout2" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="#ff606060" 
      android:orientation="vertical" > 
      <TextView 
       android:id="@+id/yourSpeedHdg" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:layout_marginLeft="3dip" 
       android:text="Your speed" 
       android:textColor="#fff" 
       android:textSize="10dip" /> 
      <TextView 
       android:id="@+id/speed" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_below="@+id/yourSpeedHdg" 
       android:layout_marginLeft="3dip" 
       android:layout_marginTop="-8dip" 
       android:text="0" 
       android:textColor="#fff" 
       android:textSize="30dip" /> 
      <TextView 
       android:id="@+id/speedUnit" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignBaseline="@+id/speed" 
       android:layout_marginLeft="5dip" 
       android:layout_toRightOf="@+id/speed" 
       android:text="kph" 
       android:textColor="#fff" 
       android:textSize="18dip" /> 
     </RelativeLayout> 
    </LinearLayout> 

    <!--================--> 
    <!-- On-map buttons --> 
    <Button 
     android:id="@+id/btnClearRoute" 
     android:background="#F00" 
     android:textColor="#fff" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Clear\nroute"/> 
    <ZoomControls 
     android:id="@+id/zoomControls" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/mapCtrl" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="-25dip" 
     android:orientation="horizontal" /> 
    <Button 
     android:id="@+id/btnFindRoute" 
     android:layout_width="100dip" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/mapCtrl" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="2dip" 
     android:layout_marginBottom="65dip" 
     android:text="Route to selected location" 
     android:textSize="17dip"/> 
    <Button 
     android:id="@+id/btnUnselect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/btnFindRoute" 
     android:layout_alignTop="@+id/btnFindRoute" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="2dip" 
     android:text="Unselect" /> 
    <LinearLayout 
     android:id="@+id/showMePanel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/btnFindRoute" 
     android:layout_alignRight="@+id/btnFindRoute" 
     android:layout_alignLeft="@+id/btnFindRoute" 
     android:padding="4dip" 
     android:background="#bbbb" 
     android:gravity="center" 
     android:orientation="vertical"> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Show me..." 
      android:textColor="#fff"/> 
     <Button 
      android:id="@+id/btnShowVehicle" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="My car"/> 
     <Button 
      android:id="@+id/btnShowRoute" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="The route"/> 
     <Button 
      android:id="@+id/btnShowDestination" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Destination"/> 
     <Button 
      android:id="@+id/btnShowMap" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="The map"/> 
    </LinearLayout> 
</RelativeLayout> 

Die Aktivitätsklasse einfach schaltet die Sichtbarkeit der beiden Tasten, wenn eine der Schaltflächen geklickt werden. Auch bei einigen Geräten funktioniert es, bei anderen nicht.

package mentor.simplegps; 

import android.app.*; 
import android.os.Bundle; 
import android.view.*; 
import android.widget.*; 

public class TestActivity extends Activity implements View.OnClickListener 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.test); 
     boilerplate(); 
     setVisibilities(); 
    } 

    Button _btnShowMap, _btnShowVehicle, _btnShowRoute, _btnShowDestination; 
    Button _btnUnselect, _btnFindRoute, _btnNavMode; 
    TextView _title; 

    void boilerplate() 
    { 
     _btnUnselect = attachBtn(R.id.btnUnselect); 
     _btnShowMap = attachBtn(R.id.btnShowMap); 
     _btnShowVehicle = attachBtn(R.id.btnShowVehicle); 
     _btnShowRoute = attachBtn(R.id.btnShowRoute); 
     _btnShowDestination = attachBtn(R.id.btnShowDestination); 
     _btnFindRoute = attachBtn(R.id.btnFindRoute); 
     _btnNavMode = attachBtn(R.id.btnNavMode); 
     _title = (TextView)findViewById(R.id.title); 
    } 
    private Button attachBtn(int btnId) { 
     Button b = (Button)findViewById(btnId); 
     b.setOnClickListener(this); 
     return b; 
    } 

    boolean haveSel; 
    public void onClick(View v) 
    { 
     haveSel = !haveSel; 
     setVisibilities(); 
    } 
    void setVisibilities() 
    { 
     _btnFindRoute.setVisibility(haveSel ? View.VISIBLE : View.INVISIBLE); 
     _btnUnselect.setVisibility (haveSel ? View.VISIBLE : View.INVISIBLE); 

     // Fixes the problem 
     //_title.setText(_title.getText()); 
    } 
} 

Antwort

36

Surface ist der einzige Schuldige (natürlich gilt dies auch für GLSurfaceView, RSSurfaceView und Videoview, die alle von Surface erbt). Es zeigt viele seltsame Verhaltensweisen im Umgang mit anderen Ansichten darüber. Das Abspielen mit View.setVisibility() ist eines dieser Probleme. Offensichtlich wurde SurfaceView nicht für die Verwendung mit anderen Ansichten entwickelt (obwohl das offizielle Dokument dies vorschreibt), sondern als eigenständige Ansicht für Videos, Spiele oder OpenGL-Inhalte.

Für das Sichtbarkeitsproblem, habe ich festgestellt, dass mit View.GONE statt View.INVISIBLE lösen. Wenn Sie GONE nicht verwenden möchten, versuchen Sie beispielsweise, den Fokus zu ändern (und zurück zu dem Fokus) oder ändern Sie andere Zustände. Ziel ist es, das zugrunde liegende UI-System irgendwie aufzuwecken.

Kurz gesagt: Wenn etwas Seltsames mit Ihren Ansichten passiert und Sie irgendwo eine SurfaceView (oder Unterklasse) haben, versuchen Sie es durch etwas anderes zu ersetzen, damit Sie nicht stundenlang suchen, was Sie falsch machen es richtig (und keine falschen Überzeugungen). Auf diese Weise wissen Sie, dass SurfaceView schuld ist und Sie können es mit schönen Kommentaren hacken, um es ohne Bedenken zu pissen.

+0

Dank hat gut funktioniert! Könnte als Antwort markiert werden ... –

+0

Ich hatte eine ähnliche Situation, aber nicht mit SurfaceView. Der Versuch, zwischen INVISIBLE und VISIBLE zu wechseln, funktionierte nicht. Aber GONE to VISIBLE tat es. Stelle dir das vor. –

+0

Ich versuchte GONE/VISIBLE auf der Ansicht, die Overlay Overlay Overlay überlagern, aber es hat nicht funktioniert, schließlich SurfaceView GONE zu machen. – Prakash

13

Für das Protokoll: Ich hatte dieses Problem versucht, ein paar zufälligen Sachen (Danke Alex!), Und in meinem Fall, was es gelöst tat seekBar.requestLayout() direkt nach dem setVisible auf der sehr seekbar zu zeigen, dass ich weigerte.

+0

großartig! :) Das funktioniert für mich. Ich versteckte einen Knopf in der Kamera, und als ich es zeigen musste, legte ich es auf den sichtbaren und requestLayout Knopf –

0

In meinem Fall View.VISIBLE/View.GONE funktionierte nicht immer. Als ich meinen Schalter auf View.VISIBLE/View.INVISIBLE umschaltete, fing es an, wie beabsichtigt zu arbeiten.

0

Ich (ärgerlicherweise) hatte ähnliche Schwierigkeiten mit einem Button über einer SurfaceView-Vorschau und musste den Button in ein RelativeLayout setzen und das RelativeLayout SICHTBAR/UNSICHTBAR machen. Könnte ein Schuss für jemand anderen wert sein, der das gleiche Problem hat.

... Und ich musste auch programmatisch das Layout aufrufen, von dem aus: buttonLayout.bringToFront() direkt nach findViewById aufgerufen werden soll.

1

Dies ist meine Lösung

setAlpha(0) 
btnName.setAlpha(0) 

Arbeitet für alle Ansichten wie => Buttons - Bilder - Texte und ...

Verwandte Themen