0

別の日、別のエラー、ああ、新しいプログラマーの人生。またはに描画bitmapしようとしていますが、機能しません。私はこのコードを数時間見ていて、なぜそれが機能しないのかを理解しようとしています。以下はコードです。エラーが発生せず、プログラムが実行され、ビットマップが表示されないだけですTextViewImageView

CustomView.java

public class CustomView extends ImageView {

public CustomView(Context context) {
    super(context);     
    // TODO Auto-generated constructor stub
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);      
    // TODO Auto-generated constructor stub
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);        
    // TODO Auto-generated constructor stub
}   

@Override
public void onDraw(Canvas canvas) {
    Bitmap line = BitmapFactory.decodeResource(getResources(), R.drawable.line);
    canvas.drawBitmap(line, 0, 0, null);
            super.onDraw(canvas);       
}
}

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   // Hail Mary. If this works then look up how to really use 'onMeasure()'.
   setMeasuredDimension(200, 50);
}

主な活動

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main); 

    refreshView();
}

private void refreshView() {
    Spinner spinner = (Spinner) findViewById(R.id.location_spinner);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
             android.R.layout.simple_spinner_item, model.getLocationsArray());

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinner.setAdapter(adapter);

    SimpleDateFormat sdf = new SimpleDateFormat("E, MMM dd");

    TextView goalText = (TextView) findViewById(R.id.goal_Id);
    TextView dateText = (TextView) findViewById(R.id.date_Id);
    TextView countText = (TextView) findViewById(R.id.count);
    TextView daysText = (TextView) findViewById(R.id.days);
    TextView totalText = (TextView) findViewById(R.id.total);
    TextView aveText = (TextView) findViewById(R.id.ave);       

    GregorianCalendar now = new GregorianCalendar();
    goalText.setTextColor(Color.RED);
    goalText.setText("Today's Goal: Don't Smoke at ");
    dateText.setText(sdf.format(now.getTime()));
    //get today's count from data in the SQLite table - count entries with today's date
    countText.setText("" + mySmokinDatabase.getTodaysCount());
    // Table data
    daysText.setText("" + String.format("%10d", model.getDays()));
    totalText.setText("" + mySmokinDatabase.getTotal());

    if (model.getDays() > 0)
        aveText.setText("" + mySmokinDatabase.getTotal()/model.getDays());

}

MainActivity.xml

<ImageView class="com.example.smokin4thomassullivan.CustomView"
    android:id="@+id/line_Id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/line"
    android:textAppearance="?android:attr/textAppearanceSmall" />

Logcat

03-22 20:17:47.272: E/AndroidRuntime(1474): FATAL EXCEPTION: main
03-22 20:17:47.272: E/AndroidRuntime(1474): java.lang.RuntimeException: Unable to start 
activity ComponentInfo{com.example.smokin4ThomasSullivan/com.example.smokin4
ThomasSullivan.MainActivity}: android.view.InflateException: Binary XML file line #21:  
Error inflating class com.example.smokin4thomassullivan.CustomView
03-22 20:17:47.272: E/AndroidRuntime(1474):     at  
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at  
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.ActivityThread.access$600(ActivityThread.java:130)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.os.Handler.dispatchMessage(Handler.java:99)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.os.Looper.loop(Looper.java:137)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.ActivityThread.main(ActivityThread.java:4745)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
java.lang.reflect.Method.invokeNative(Native Method)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
java.lang.reflect.Method.invoke(Method.java:511)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at   
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
dalvik.system.NativeStart.main(Native Method)
03-22 20:17:47.272: E/AndroidRuntime(1474): Caused by: android.view.InflateException: 
Binary XML file line #21: Error inflating class 
com.example.smokin4thomassullivan.CustomView
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.view.LayoutInflater.inflate(LayoutInflater.java:489)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at   
android.view.LayoutInflater.inflate(LayoutInflater.java:396)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.view.LayoutInflater.inflate(LayoutInflater.java:352)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.Activity.setContentView(Activity.java:1867)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
com.example.smokin4ThomasSullivan.MainActivity.onCreate(MainActivity.java:40)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.Activity.performCreate(Activity.java:5008)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
03-22 20:17:47.272: E/AndroidRuntime(1474):     ... 11 more
03-22 20:17:47.272: E/AndroidRuntime(1474): Caused by: 
java.lang.ClassNotFoundException: com.example.smokin4thomassullivan.CustomView
03-22 20:17:47.272: E/AndroidRuntime(1474):     at  
dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
java.lang.ClassLoader.loadClass(ClassLoader.java:501)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at   
java.lang.ClassLoader.loadClass(ClassLoader.java:461)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at  
android.view.LayoutInflater.createView(LayoutInflater.java:552)
03-22 20:17:47.272: E/AndroidRuntime(1474):     at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
03-22 20:17:47.272: E/AndroidRuntime(1474):     ... 21 more`

助けてくれてありがとう!

4

3 に答える 3

3

XMLコードには次のものが含まれています。

<ImageView class="com.example.smokin4thomassullivan.CustomView" />

これによりImageView、のインスタンスではなく、が作成されますCustomView。これは、カスタムonDraw()メソッドが実行されないことを意味します。探している構文は次のとおりです。

<com.example.smokin4thomassullivan.CustomView />

このclass属性は<view />タグでのみ機能します(名前に$が含まれているため、内部クラスを参照する場合にのみ必要です)。

于 2013-03-23T00:11:45.487 に答える
1

これを試して、ImageViewの拡張をテストしてください。

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    System.out.println("onDraw");
    Paint paint = new Paint(Paint.LINEAR_TEXT_FLAG);
    paint.setColor(0xFFFF8844);
    paint.setTextSize(12.0F);
    canvas.drawText("Hello David!", 100, 100, paint);
}

を取り除きonMeasure()ます。

于 2013-03-22T22:36:09.993 に答える
0

私はこのように物事を行う目的を理解していません。ImageViewの上にTextViewを使用してRelativeLayoutを作成する方が簡単ではないでしょうか。何かのようなもの:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="128dp"
        android:layout_marginTop="51dp"
        android:src="@android:drawable/btn_dialog" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView1"
        android:layout_alignTop="@+id/imageView1"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

</RelativeLayout>

またはさらに良いことに、TextViewをLinearLayoutに配置し、画像をLinearLayoutの背景に設定しますか?

編集、コメントへの返信:

それは効率的であるということではなく、丸い穴に四角いペグを入れようとすることです。基本的には、単一のオブジェクト(カスタムImageView)をレイアウト全体として設定してから、単一のオブジェクト(TextView)に要素を追加しようとしているように見えます。やろうとしているのは、まさにレイアウトオブジェクトの目的です。つまり、他のオブジェクトのコレクションが含まれています。この場合、ImageViewsとTextViewsです。

もちろん、私はここで目的を逃したかもしれません。それが物事を行う珍しい方法での運動であるならば、私は理解します。ただし、画面に表示しようとしているだけの場合は、非常に複雑な方法のように思われます。通常、このコマンドsetContentView(R.layout.activity_main);は、ルートオブジェクトがレイアウトオブジェクトのバージョン(LinearLayout、RelativeLayoutなど)であるXMLファイルを設定します。そのレイアウト内には、操作するオブジェクトが含まれます。おそらく、MainActivity.xml全体がないのでしょうか。

于 2013-03-22T22:35:03.343 に答える