2016-08-02 30 views
10

Ich habe eine Logo-Ansicht, die ein Vollbild-Fragment mit einzelnen ImageView ist. Ich muss einige Operationen durchführen, nachdem das Logo vollständig sichtbar ist.onGlobalLayout unterscheidet zwischen verschiedenen Aufrufen

folgenden Code wird verwendet, um die besondere Aufgabe aufzurufen

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     ImageView logoImageMaster = new ImageView(getContext()); 
     //logoImageMaster.setImageResource(resID); //even after removing this, i am getting the callback twice 
     try { 
      // get input stream 
      InputStream ims = getActivity().getAssets().open("product_logo.png"); 
      // load image as Drawable 
      Drawable d = Drawable.createFromStream(ims, null); 
      // set image to ImageView 
      logoImageMaster.setImageDrawable(d); 
     } 
     catch(IOException ex) { 

     } 
     logoImageMaster.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { //FIXME get called twice. Check this out, no info to distinguish first from second 
//    Log.e("PANEL", "onGlobalLayout of Logo IV ---------------------------------"); 
        activityInterface.doSpecialLogic(); 
      } 
     }); 
     return logoImageMaster; 
    } 

Mein genaue Problem ist, ist onGlobalLayout zweimal für diese Ansicht Hierarchie genannt.

Ich weiß, dass in von View.java aufgerufen wird, daher wird dies erwartet.

Für meinen Anwendungsfall von Alleinerziehende mit Einzel Kind Ansicht, mag ich die Ansicht unterscheiden Attribute, so dass doSpecialLogic einmal aufgerufen wird [onGlobalLayout wird zweimal genannt], nachdem das Logobild vollständig sichtbar gemacht wird. Bitte schlagen Sie einige Ideen vor.

Antwort

3

OnGlobalLayoutListener wird jedes Mal aufgerufen, wenn sich das Ansichtslayout oder die Sichtbarkeit ändern. Vielleicht setzen Sie die Ansichten in Ihrem doSpecialLogic-Aufruf zurück ??
bearbeiten wie @ Guille89 wies darauf hin, die beiden Satz Anrufe verursachen onGlobalLayout bis zweimal

Wie auch immer genannt zu werden, wenn man nur einmal anrufen OnGlobalLayoutListener wollen und es nicht für etwas anderes brauchen, wie etwa das Entfernen es nach doSpecialLogic() aufrufen ??

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
      //noinspection deprecation 
       logoImageMaster.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } else { 
      logoImageMaster.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        } 
activityInterface.doSpecialLogic(); 
+0

Hallo, ich bekomme immer noch zweimal, jetzt ich nur ein einziges Mal gesetzt, bitte sehen Sie die Updates auf die Frage – nmxprime

+0

Nein, ich bin nicht die Sicht in 'doSpecialLogic' – nmxprime

+0

und wie die Dokumente onGlobalLayout =" Callback-Methode zu sein Wird aufgerufen, wenn der globale Layout-Status oder die Sichtbarkeit von Ansichten in der Ansichtsstruktur " " ändert, sodass die Ansichten erneut geladen werden müssen, wodurch der onGlobalLayout-Wert zweimal aufgerufen wird. –

1

Es scheint, für jeden Satz über den Imageview

logoImageMaster.setImageResource(resID); 

logoImageMaster.setImageDrawable(d); 
+0

Hallo, ich bekomme immer noch zweimal, jetzt Ich setze nur ein Mal, bitte sehen Sie die Updates zu der Frage – nmxprime

1

Sie sollten nach etwas in Android

mit Kotlin Plugin getan einmal aufgerufen werden versuchen Dieses Layout Hörer in der Regel verwendet, um zu tun eine Ansicht wird gemessen, so dass Sie normalerweise warten müssen, bis Breite und Höhe größer als 0 sind. Und wir möchten wahrscheinlich etwas mit der Ansicht machen, die es aufgerufen hat, in Ihrem Fall Imageview

So generified die Funktion, so dass es von jedem Objekt verwendet werden kann, die Ansicht erweitert und auch

[kotlin] 
    inline fun <T: View> T.afterMeasured(crossinline f: T.() -> Unit) { 
    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { 
    override fun onGlobalLayout() { 
    if (measuredWidth > 0 && measuredHeight > 0) { 
    viewTreeObserver.removeOnGlobalLayoutListener(this) 
    f() 
    } 
    } 
    }) 
    } 
[/kotlin] 

Hinweis auf all seinen spezifischen Funktionen und Eigenschaften von der Funktion zugreifen können: sicherstellen, dass Image ist im Layout richtig beschrieben. Das ist seine layout_width und layout_height darf nicht wrap_content sein. Außerdem dürfen andere Ansichten nicht dazu führen, dass dieser ImageView die Größe 0 hat.

+0

Sorry. Ich darf keines der externen Plugins verwenden – nmxprime