2013-03-22 49 views
0

另一天,另一個錯誤,一個新程序員的生活啊。我試圖畫一個bitmapTextViewImageView,它不工作。我一直在看這個代碼幾個小時,試圖找出爲什麼它不工作。以下是代碼。我沒有收到任何錯誤,程序運行時,它根本不顯示位圖Android:繪製位圖到TextView不起作用

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` 

感謝您的幫助!

+1

的logcat很清楚。第73行是什麼? – Simon 2013-03-22 22:18:51

+0

@Simon'73號線:spinner.setAdapter(適配器);' 這是瘋狂的,因爲該代碼是在上面貼刷新視圖的方法和它未被觸動,它也工作,如果我不使用這個ImageView的。我儘快得到的錯誤,因爲我設置執行此 '行:的setContentView(新CustomView(本));' – IrishWhiskey 2013-03-22 22:21:29

+1

不是瘋了的。 onCreate()會在您的活動加載完成後立即被調用,然後調用refresh(),所以是,代碼「被觸摸」。由於適配器是新的,所以微調器必須爲空(當然你可以在調試器中檢查)。因此,findviewById()在當前充氣佈局中未找到微調器。順便說一句,你的問題標題是非感性的,並沒有描述你遇到的問題。您不能「繪製」到TextView的位圖。 – Simon 2013-03-22 22:31:51

回答

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> 

甚至更​​好,放置在LinearLayout中TextView的,並且將圖像設置到的LinearLayout的背景是什麼?

編輯,回覆評論:

這不是爲有效,它是關於試圖把一個正方形掛在一個圓洞。它基本上看起來好像您將單個對象(自定義ImageView)設置爲整個佈局,然後嘗試將其他元素添加到單個對象(TextView)。試圖做的就是佈局對象的用途:包含其他對象的集合。在這種情況下,ImageViews和TextViews。

當然,我可能已經錯過了這裏的目的。如果這是一種不尋常的做事方式,那麼我明白了。但是,如果您只是試圖在屏幕上顯示內容,這似乎是一種非常複雜的方式。通常,命令setContentView(R.layout.activity_main);設置一個XML文件,其中根對象是佈局對象(LinearLayout,RelativeLayout等)的某個版本。在該佈局中,將是您要操作的對象。也許我們沒有完整的MainActivity.xml?

+0

我真的不認爲這對我有幫助。我的問題不在於如何重新設計我的程序以提高效率。這就是爲什麼在我的主要活動 – IrishWhiskey 2013-03-22 22:58:24

+1

的視圖中不顯示位圖CustomView是一個ImageView還是一個TextView? CustomView.java擴展TextView,而MainActivity.xml使用ImageView。 – 2013-03-22 23:28:01

+0

查看更新回答! – 2013-03-23 03:19:32

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()

+0

謝謝你的建設性答案David Manpearl。但是這並不能解決問題。我改變了'onDraw',它仍然不會顯示在我的活動中。我編輯了原始文章以顯示我的MainActivity和onDraw – IrishWhiskey 2013-03-22 22:47:43

+0

Ooops中的更改,但我在我的CustomView.java中擴展了TextView。我真的認爲你有答案,但不是。它仍然不會在我的活動中顯示位圖。我更新了頂部的代碼以顯示更改 – IrishWhiskey 2013-03-22 23:46:07

+1

嘗試剛剛編輯到我的答案中的臨時'onDraw()'建議。 – 2013-03-22 23:58:18

3

你的XML代碼包含:

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

這將創建一個ImageView,而不是CustomView一個實例。這意味着您的自定義onDraw()方法將永遠不會執行。你正在尋找的語法是:

<com.example.smokin4thomassullivan.CustomView /> 

class屬性只能與<view />標籤(只有當你想引用一個內部類,因爲它們的名稱中包含$它需要)

+0

那麼我試過你的解決方案,這可能是正確的。然而,現在我得到一個很好的長logcat錯誤,我的程序崩潰了。 logcat發佈在我原來的問題的底部。它基本上說它找不到我的CustomView類,或者它不存在 – IrishWhiskey 2013-03-23 00:20:42

+1

您沒有粘貼足夠的堆棧跟蹤。墜機的原因應該會進一步下降。這可能是你的課是在錯誤的包,而不是靜態的,等等。 – 2013-03-23 00:24:52

+0

更新了帖子 – IrishWhiskey 2013-03-23 00:35:09