2017-09-07 2 views
0

Ich frage mich, wenn während eines Lebenszyklus Aktivitäten Blick wird verlegt beginnen, oder vielleicht, wenn ein Viewgroup seine Zeit, sich um das Layout entscheidet.Wann ist ein Vorgang Layout Es ist Ansichten

Ich habe eine Klasse und Aktivität wie diese aufgebaut ->

public class MainActivity extends AppCompatActivity 
{ 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     Log.i("i", "on Create"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     myStack = (myStack) findViewById(R.id.myStack); 
     myStack.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
    { 
     @Override 
     public void onGlobalLayout() 
     { 
     Log.i("i", "listener detected Layout"); 
     } 
     } 
     myStackAdapter adapter = new myStackAdapter(dataset); 
     myStack.setAdapter(adapter); 
    } 
    protected void onStart() 
    { 
     Log.i("i", "on Start"); 
     super.onStart(); 
    } 
} 

public class myStack extends ViewGroup 
{ 
    public myStack(Context context, AttributeSet attrs, int defStyleAttr) 
    { 
     super(context, attrs, defStyleAttr); 
     initialize(); 
    } 
    public void initialize() 
    { 
     Log.i("i", "initialize called"); 
    } 
    public void onLayout(boolean changed, int l, int t, int r, int b) 
    { 
     Log.i("i", "on Layout"); 
     if (adapter == null) 
     { 
     Log.i("i", "adapter is null"); 
     return; 
     } 
     for (conditions) 
     { 
     addNextView(); 
     } 
    } 
    public void setAdapter(Adapter adapter) 
    { 
     Log.i("i", "adapter set"); 
     this.adapter = adapter; 
    } 

Der Ausgang ist als

folgt
  • initialize genannt
  • Adapter-Set
  • auf Layout-

Bearbeiten: hinzugefügt mehr c hecks, Ausgabe ist -on Create, -initialisiert aufgerufen, -adapter gesetzt, -on Start, -auf Layout, -listenerfasst Layout

Allerdings bedeutet dies, dass onLayout nur aufgerufen wird, nachdem setAdapter aufgerufen wurde die MainActivity, da mein Adapter standardmäßig Null ist. Ich frage mich also, wann OnLayout zum ersten Mal ausgelöst wird. Ist es nach onCreate in der MainActivity beendet (vielleicht während onStart)? oder sonst gibt es einen anderen Grund, warum onLayout (nach onMeasure) nicht das erste Ding sein würde, das wenn myStack instanziiert wird.

+0

, wenn Sie anrufen 'setContentView()'. –

+0

@Zamrony Wenn das aber der Fall wäre dann wäre die Ausgabe nicht "auf Layout -> Adapter ist Null -> initialisiert -> Adaptersatz"? –

+0

[Warum getWidth() auf einem Blick in onResume hat() aufrufen return 0?] (Https://stackoverflow.com/q/22972022/3290339) – Onik

Antwort

0

onLayout() innerhalb layout() aufgerufen, wenn Ansichtsgröße geändert wird oder nach der Messphase ist abgeschlossen und mPrivateFlags enthält PFLAG_LAYOUT_REQUIRED Bit gesetzt.

Es ist sehr wahrscheinlich, dass Ihre Klasse myStack weder die Größe noch das erforderliche Layout-Flag geändert hat, da sie noch keine untergeordnete Ansicht enthält.

Sobald Sie Adapter-Set, dann wird untergeordnete Ansicht eingefügt und Ansicht Gruppengröße geändert machen, damit onLayout() ausgelöst wird.

+0

Es ist nicht in diesem Code-Snippet geschrieben, aber nach meinem (Adapter == null) zu überprüfen, habe ich Eine for-Schleife, die mit addViewInLayout() Ansichten zu myStack hinzufügt. Dies ist der einzige Ort, an dem ich addView in dieser Klasse anrufe. Daher hat myStack keine untergeordneten Ansichten, bis onLayout() bereits aufgerufen wurde. –

+0

Ich habe den Code aktualisiert, um das zu zeigen, und habe auch Oniks Vorschlag angenommen und einen Layout-Listener eingerichtet. Es scheint, dass doesnt Layout bis aufgerufen, nachdem der Adapter eingestellt ist und nach auf Start –

+0

@ user3363126, bei dem der Punkt ruft das System 'onLayout-()' nichts gemein mit dem Adapter. Hast du die Erklärung zu meiner Antwort gelesen, die ich im Kommentar erwähnt habe, oder den anderen Referenzen in der Post gefolgt? Außerdem empfehle ich [hier] zu schauen (https://stackoverflow.com/q/13146765/3290339) – Onik

Verwandte Themen