2016-05-14 13 views
0

画面が白い場合& onDraw内のSystem.out.println()は呼び出されません。カスタムビュークラスのonDrawが無効化によって呼び出されない

これは、カスタムビュークラスの私activity_main.xml

<foo.packagename.MyView 
    android:id="@+id/myView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

です:主な活動

public class MyView extends View { 

public MyView(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 

    System.out.println("This line is called"); 

    while (true) { 
     invalidate(); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.GREEN); 
    System.out.println("This line is never printed"); 
} 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     System.out.println("This line is called"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     View myView = findViewById(R.id.myView); 
    } 
} 
+0

コンストラクタで 'while'ループを取り除きます。 –

+0

それはそれを修正しました。私はまだ問題が何だったのか理解していませんが – eikai

+0

ああ、私が返信している間にあなたのコメントを変更したに違いないと気付かなかった。ええ、以下の答えはそれを説明しています。 –

答えて

0

invalidate()onDraw()が直接呼び出されることはありません。これは、ビューに次の描画フレームで再描画する必要があることをシステムに通知するだけです。それ以外の場合、次の図面フレームでは、何も変更されていないので、以前に描画されたものを使用することができます。つまり、invalidate()コールと最終的なonDraw()コールは非同期です。

ループをコンストラクタ内に無限に置くと、UIスレッドはそのポイントを超えるコードを実行しないため、システムは1回のレイアウトパスを完了することがなく、ビューも一度も描画されません。言うまでもなく、はこれをしません

関連する問題