2010-07-27 3 views
37
<LinearLayout android:id="@+id/svLL" android:orientation="horizontal" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 
    <ScrollView android:id="@+id/sv" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
     <!-- 
      <TextView android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/scrollbar_2_text" /> 
     --> 
     <com.mypackage.MyDrawableView 
      android:layout_width="fill_parent" android:layout_height="wrap_content" /> 
    </ScrollView> 
</LinearLayout> 

public class MyDrawableView extends View { 

    Context thisContext; 

    public MyDrawableView(Context context, AttributeSet attr) { 
     super(context); 
     thisContext = context; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     final Paint paint = new Paint(); 
     paint.setColor(Color.BLUE); 
     paint.setTextSize(12); 
     canvas.drawText("Blah blah", 0, 100, paint); 
    } 
} 

public class MyActivity extends Activity { 
    // Your member variable declaration here 
    // Called when the activity is first created. 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // Your code here super.onCreate(savedInstanceState); 
     setContentView(R.layout.xmllayout); 
     LinearLayout svll = (LinearLayout) findViewById(R.id.svLL); 
     svll.setLayoutParams(new LinearLayout.LayoutParams(300, 300)); 
    } 

} 

я ставлю точку останова, но точка останова никогда не попал внутрь onDraw() метода, что не так?Пользовательские OnDraw() не называется

+0

Каков код вашей деятельности? может быть, проблема есть? – Sephy

+0

public class MyActivity extends Activity { \t // Объявление переменной вашего члена здесь \t // Вызывается, когда действие сначала создается. \t @Override \t общественного недействительными OnCreate (Bundle savedInstanceState) { \t \t // Ваш код здесь \t \t super.onCreate (savedInstanceState); \t \t setContentView (R.layout.xmllayout); \t \t LinearLayout svll = (LinearLayout) findViewById (R.id.svLL); \t \t svll.setLayoutParams (новый LinearLayout.LayoutParams (300, 300)); \t} } – mynameisanthpny

+0

Я переместил свой код в этот вопрос, так что это более понятно –

ответ

33

Ваш вид имеет высоту 0. У вас есть вид height=wrap_content, но ваш не переопределяет onMeasure(), чтобы сообщить инструментарию пользовательского интерфейса, насколько велика ваша точка зрения.

0

Хотя я новичок в андроиде, до сих пор я считаю, что проблема из-за

setContentView(R.layout.xmllayout); 

Вместо "R.layout.xmllayout", передать MyDrawableView объект (используя findViewById) и проверьте. Я не пробовал, но надеюсь, что это сработает.

3

Просто сделайте layout_width и layout_height пользовательского вида исправления в начальное время, а не wrap_content или fill_parent. Это сработало для меня.

68

Добавить setWillNotDraw(false) в конструктор MyDrawableView. Оригинальный ответ: here.

+11

Это применимо to viewgroup not view –

+0

И я может подтвердить, что он работает чудесно! –

+0

Работал для расширенного RelativeLayout, спасибо :) – wblaschko

14

@OverrideOnMeasure(int, int) способ указать размер Вашего мнения, позвонив по телефону setMeasuredDimension(int,int).

Если вы этого не сделаете, метод по умолчанию установит ваш вид размером width=0 height=0. И поэтому даже не пытайтесь называть onDraw.

Метод OnMeasure вызывает setMeasuredDimension(int,int), который сообщает, насколько велика ваша точка зрения.

(так что вам нужно получить размер экрана андроида по методу OnMeasure и позвонить по телефону setMeasuredDimension соответственно).

+0

Действительно, когда размеры равны 0, то onDraw() не вызывается. Я использовал getSmittedMinimumWidth(), который вернулся 0. Затем я использовал это с помощью setMeasuredDimension(), чтобы сделать квадрат ... Нет необходимости говорить, что onDraw() не вызывался. –

0

Вам нужно использовать метод invalidate() в методе конструктора, чтобы получить вызов onDraw.

0

После установки пользовательской ширины просмотра вы должны установить ширину прокрутки.

FMChart = (HKFMDrawChart)findViewById(R.id.fm_chart); 
FMChart.setWidth(xxxx); 
float scrollViewWidth = FMChart.getScrellViewWidth(); 
FMChart.setLayoutParams(new LinearLayout.LayoutParams(
     (int) (scrollViewWidth + HKApplication.getScreenWidth()/2), 
     LinearLayout.LayoutParams.WRAP_CONTENT)); 
FMChart.postInvalidate(); // onDraw(); 
0

Возможно

setMinimumHeight(width); 
setMinimumWidth(height); 

в конструкторе не установлены или onMeasure() не перекрываться.

Смежные вопросы