2016-04-07 10 views
1

ich die Höhe einer Ansicht mit der TreeObserver Methode erhalten mag:Erhalten Höhe Blick - Variable werden muss, um final deklarierte

 int v1_h; 
     v1.getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener() { 
      @SuppressLint("NewApi") 
      @SuppressWarnings("deprecation") 
      @Override 
      public void onGlobalLayout() { 
       //now we can retrieve the width and height 

       v1_h = v1.getHeight(); 


       if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) 
        v1.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       else 
        v1.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
     }); 

//Do something with v1_h later on 

Ich möchte in einer Variablen, die Höhe speichern und später verwenden. Problem ist, dass es für den Zugriff auf die innere Klasse deklariert werden muss. Also mache ich es endgültig, aber jetzt sagt es, dass es nicht zugewiesen werden kann. Irgendwelche Ideen, wie das zu beheben ist?

+1

Declare v1_h in einem Top-Level-Umfang rufen Sie addOnGlobalLayoutListener Methode –

+0

ich verstehe nicht. Ich habe versucht, v1_h oben aufGlobalLayout() als eine globale Variable zu setzen, aber sie konnte später nicht unten gefunden werden, wenn ich mich außerhalb des Baumbeobachter-Codes befinde. Könnten Sie bitte erklären? – user1197993

+0

@ user1197993 Grund für die Annahme der Antwort, die ich zur Verfügung gestellt habe? –

Antwort

1

Am einfachsten deklarieren Sie die Variable als Klassenmitglied anstelle einer auf dem Stack deklarierten Variablen. Wenn Sie v1_h final machen, können Sie es nicht wirklich so verwenden, wie Sie es erwarten.

0

Eigentlich v1_h und die innere Klasse, die Sie erstellt „new ViewTreeObserver.OnGlobalLayoutListener()...“ im gleichen Umfang sind, wenn Sie den Wert von v1_h ändern möchten, sollten Sie die Erklärung auf einer oberen Ebene des Bereichs bewegen, ich weiß nicht, wie genau Ihre Code geht aber ich mache ein Beispiel zu verstehen, was ich rede:

public class MainActivity extends Activity { 
//The scope you should declare your variable in, No need to declare as a final 
//Here is an upper level scope than inner class's! 
int v1_h; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    ... 
    //1.The scope you declared your variable in 
    //2.Where the inner class is 
     v1.getViewTreeObserver().addOnGlobalLayoutListener(...) 
    //1 && 2 => They were in the same scope in your code 
    ... 
    } 
} 

Hoffe, es hilft ...

+0

Ja, ich habe versucht, es zu einer globalen Variable zu machen, aber es hat den Wert nicht aktualisiert, als es an der Zeit war, die Höhe zu bekommen. Aus irgendeinem Grund war der in v1_h gespeicherte Wert immer 0, obwohl getHeight() die korrekten Werte zurückgab. – user1197993

+0

Wenn Sie den Fehler bei der Kompilierung nicht mehr bekommen, ist das ein anderes Problem. Stellen Sie eine andere Frage. –

Verwandte Themen