2017-09-07 3 views
0

アクティビティライフサイクルビューのレイアウトがいつ開始されるのか、またはビューグループがレイアウトの時間を決定するときに、私は思っています。アクティビティレイアウトのビューはいつですか

は、私はこのような設定クラスおよび活性を持っている - >

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; 
    } 

  • と呼ばれる初期
  • アダプタセットレイアウト
を次のように出力されます

編集:追加c 出力は-on Create、-inapterialize、-onset、-on start、-on Layout、-listenerの検出済みレイアウトです。

ただし、これはsetAdapterが呼び出された後にのみonLayoutが呼び出されることを意味しますMainActivityは、私のアダプタがデフォルトでnullであるためです。だから私はonLayoutが初めてトリガされたのかと思います。 onCreateがMainActivityで終了したのは(たぶんonStart中に)ですか?そうでなければ、onLayout(onMeasureに続く)がmyStackをインスタンス化するときに最初に呼び出されないことがある他の理由があります。

+0

です。 –

+0

@ Zamronyしかし、そうであれば、出力は "layout - > adapterはnull - > initialize called - > adapter set"になりませんか? –

+0

[onResume()のビューでgetWidth()を呼び出すのがなぜ0ですか?](https://stackoverflow.com/q/22972022/3290339) – Onik

答えて

0

onLayout()は、ビューサイズを変更した場合や測定フェーズが終了した場合にlayout()と呼ばれ、mPrivateFlagsにはPFLAG_LAYOUT_REQUIREDビットが含まれています。

myStackクラスはまだ子ビューを含んでいないため、サイズやレイアウトフラグが変更されていない可能性があります。

アダプターを設定すると、子ビューが挿入され、ビューグループのサイズが変更されると、onLayout()がトリガーされます。 `setContentView()`を呼び出すと

+0

です。 forループは、addViewInLayout()を使用してmyStackにビューを追加します。これは私がこのクラスでaddViewを呼び出す唯一の場所です。したがって、myStackはonLayout()がすでに呼び出されるまで子ビューを持ちません。 –

+0

これを示すためにコードを更新し、Onikの提案を受けてレイアウトリスナを設定しました。アダプタが設定されてからStart –

+0

@ user3363126の後にレイアウトが呼び出されるまでは、システムが 'onLayout()'を呼び出すポイントはあなたのアダプタと何も共通していません。あなたはそのコメントを引用した私の答えに説明を読んだり、投稿の他の言及に従っていますか?また、私は[ここ](https://stackoverflow.com/q/13146765/3290339)を参照することをお勧めします – Onik

関連する問題