2010-07-27 30 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)); 
    } 

} 

aramadı ama kırılma noktası, sorun ne onDraw() yöntemi içinde isabet asla?Özel onDraw() yöntemi bir kesme noktası koyuyorum

+0

Etkinliğinizin kodu nedir? belki sorun var mı – Sephy

+0

public class MyAktivite genişletir Activity { \t // Üyelik değişken bildiriminiz \t // Etkinlik ilk oluşturulduğunda çağrılır. \t @Override \t public void onCreate (Bundle savedInstanceState) { \t \t // Buradaki kod \t \t super.onCreate (savedInstanceState); \t \t setContentView (R.layout.xmllayout); \t \t LinearLayout svll = (LinearLayout) findViewById (R.id.svLL); \t \t svll.setLayoutParams (yeni LinearLayout.LayoutParams (300, 300)); \t} } – mynameisanthpny

+0

ben gündeme kodunuzu taşındı, bu yüzden –

cevap

33

Görünümünüzün yüksekliği 0'dır. Görünümünüzün height=wrap_content olmasını ayarlamışsınızdır, ancak UI araç setine Görünümünüzün ne kadar büyük olduğunu bildirmek için onMeasure() geçersiz kılma. Ben android yeni olsam da

0

, hala

yerine "R.layout.xmllayout" ait
setContentView(R.layout.xmllayout); 

, (findViewById kullanarak) MyDrawableView nesneyi geçmek ve kontrol nedeniyle sorun olduğuna inanıyoruz. Denemedim ama umut, işe yarayacak.

3

Sadece layout_width ve geleneğin layout_height ilk defa yerine wrap_content veya fill_parent bazı düzeltme görüntülemek olun. Bu benim için çalıştı.

68

MyDrawableView yapıcısında setWillNotDraw(false)'u ekleyin. Orijinal cevap here.

+11

yapıcıda setWillNotDraw (false) görüntüleme grubuna görüntülenmiyor –

+0

Ve ben harika çalıştığını onaylayabilir! –

+0

Uzun bir RelativeLayout için çalıştınız, teşekkür ederim :) – wblaschko

14

setMeasuredDimension(int,int) numaralı telefonu arayarak görünümün boyutunu belirlemek için @OverrideOnMeasure(int, int) yöntemini kullanmanız gerekir.

Eğer yoksa, varsayılan yöntem görünümünüzü width=0 height=0 boyutuna ayarlayacaktır. Bu nedenle, onDraw'u hiç aramaya bile çalışmaz.

OnMeasure yöntemi, görünümünüzün ne kadar büyük olduğunu bildiren setMeasuredDimension(int,int) yöntemini çağırır.

(Dolayısıyla, android ekranının boyutunu OnMeasure yönteminde almanız ve buna göre setMeasuredDimension'u arayın).

+0

Gerçekten de, boyutlar 0 olduğunda, onDraw() çağrılmıyor. Ben getSuggestedMinimumWidth() kullanarak 0 döndürdüm. Sonra bir kare yapmak için setMeasuredDimension() ile ... demeye gerek yok, onDraw() çağrılmadı. –

0

OnDraw Çağırdı almak için invalidate() yapıcı yönteminde kullanmanız gerekir.

0

Özel görünüm genişliğini ayarladıktan sonra, kaydırma genişliğini ayarlamanız gerekir.

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

Muhtemelen yapıcı içinde

setMinimumHeight(width); 
setMinimumWidth(height); 

ayarlanmamış ya onMeasure() yeri etkilenmez.

İlgili konular