Eine von SurfaceView abgeleitete Java-View stürzt in einem ViewPager ab

  • 0 Antworten
  • Letztes Antwortdatum
A

astro-android

Neues Mitglied
2
Hallo, liebes Forum,

Bin mit der Programmierung von Android noch nicht lange zugange, um es mal vorweg zu nehmen.
Programmieren kann ich aber schon lange. Jedenfalls im Moment bin ich ziemlich gefrustet, weil meine App appstürzt. Ich habe jetzt 2 Tage lang versucht, den Fehler zu finden und habe dafür das Internet auf links gedreht.
Ich hoffe, dass jemand mir hier auf die Sprünge helfen kann. Die Sache ist eigentlich ziemlich simpel:

In einem einfachen ViewPager gibt es 3 Seiten. Eine davon ist eine eigene View,
in der ich eine Grafik zyklisch aktualisieren will. Die App wird zwar ohne Probleme compiliert, stürzt dann aber auf meinem Nexus7 ab (auch auf einem Motorola Pro+ - Smartphone).

Hier der Code:

Activity:

Code:
package de.test.check;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.support.v4.view.ViewPager;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


public class Check extends Activity implements TextToSpeech.OnInitListener{

  public static Locale  loc;
  public static String sloganString;
  public static int counter = 0;
  public static TextToSpeech tts;
  public static Graphic graphicView;
  
  @TargetApi(14)
  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Config.context = this;

        loc = Locale.getDefault();

        // Initialize Text To speech
    tts = new TextToSpeech(Config.context, Config.context);
        
    sloganString = Config.context.getResources().getString(R.string.start_slogan);

        Graphic view = new Graphic(Config.context);

        List<View> viewPages = new ArrayList<View>();
        ViewPager viewPager = new ViewPager(Config.context);
        setContentView(view);

        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

        View viewPage = inflater.inflate(R.layout.page_1, null);

        TextView preambleView = (TextView) viewPage.findViewById(R.id.page1_view);
        CharSequence styledText = Html.fromHtml(getResources().getString(R.string.preamble));        
        preambleView.setText(styledText);
        viewPages.add(viewPage);
        
        viewPage = inflater.inflate(R.layout.page_2, null);

        graphicView = (Graphic) viewPage.findViewById(R.id.page2_view);
        viewPages.add(viewPage);
        
        viewPage = inflater.inflate(R.layout.page_3, null);

        ImageView legendView = (ImageView) viewPage.findViewById(R.id.page3_view);
        viewPages.add(viewPage);
        
        PageAdapter pageAdapter = new PageAdapter(viewPages);
        viewPager.setAdapter(pageAdapter);
        viewPager.setCurrentItem(1);     

        //DoIt.all();

        //UpdateNow.update.sendEmptyMessage(0); /// Starten
      }

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public void onInit(int success) {
      if(success == TextToSpeech.SUCCESS){
        if(tts.isLanguageAvailable(loc) >= TextToSpeech.LANG_AVAILABLE){
            tts.setLanguage(loc);
            SpeakIt.now(Check.sloganString);
        }
      }
      else{
      tts.shutdown();
      tts = null;
      }
    }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (tts != null) {
      tts.stop();
      tts.shutdown();
      tts = null;
    }
  }
}
der Page-Adapter:

Code:
package de.test.check;

import java.util.List;

import android.os.Parcelable;
import android.support.v4.view.ViewPager;
import android.support.v4.view.PagerAdapter;
import android.view.View;

public class PageAdapter extends PagerAdapter{
    
    List<View> pages = null;
    
    public PageAdapter(List<View> pages){
        this.pages = pages;
    }
    
    @Override
    public Object instantiateItem(View collection, int position){
        View v = pages.get(position);
        ((ViewPager) collection).addView(v, 0);
        return v;
    }
    
    @Override
    public void destroyItem(View collection, int position, Object view){
        ((ViewPager) collection).removeView((View) view);
    }
    
    @Override
    public int getCount(){
        return pages.size();
    }
    
    @Override
    public boolean isViewFromObject(View view, Object object){
        return view.equals(object);
    }

    @Override
    public void finishUpdate(View arg0){
    }

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1){
    }

    @Override
    public Parcelable saveState(){
        return null;
    }

    @Override
    public void startUpdate(View arg0){
    }
}
die Java-View:

Code:
package de.test.check;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class Graphic extends SurfaceView implements Callback {

  public static SurfaceView graphicsView;
    private SurfaceHolder holder;
    private Canvas canvas;
    private Paint paint;
    private Thread th;
    private boolean isRunning = false;

  public static void putGraphic(){
  }     

  public Graphic(Context context) {
        super(context);
        init();        
    }
    
    public void init(){
        
        holder = this.getHolder();
        holder.addCallback(this);

        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        
        //Thread zum Zeichnen
        new Thread(new Runnable() { 
            public void run(){                 
                while(isRunning)
                {
                    draw(canvas);
                    try{
                        Thread.sleep(50);
                    } catch (InterruptedException e){}
                }         
            }
        }).start();
        
        isRunning = true;
    }
    
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    public void surfaceCreated(SurfaceHolder holder) {
    }
    
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
    
    public void draw(Canvas c) {     
        c = holder.lockCanvas();
        if(c != null) {
                   
            c.drawColor(Color.LTGRAY);
            c.drawCircle(400, 450, 350, paint);                 
                    
            holder.unlockCanvasAndPost(c);
        }
    }
}
und das XML-Layout:

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="... Link darf hier nicht"/schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ddd" 
    android:orientation="vertical" 
    android:padding="@dimen/padding_layout"> 

   [COLOR=Red] <de.astropartie.check.Graphic[/COLOR] [B][COLOR=Red]<< Fehler ![/COLOR][/B]
        android:id="@+id/page2view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_above="@+id/textView1" 
        android:layout_alignParentTop="true" 
        android:background="#888"/>
    
    <TextView 
        android:id="@+id/textView1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentRight="true"/>

    <Button 
        android:id="@+id/button4" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignRight="@+id/textView1" 
        android:layout_below="@+id/page2_view" 
        android:background="#ddd" 
        android:text="@string/button_next" 
        android:textColor="@color/col_back_view_1" 
        android:textSize="@dimen/preamble_text_size"/>
    
    <Button 
        android:id="@+id/button3" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignLeft="@+id/textView1" 
        android:layout_alignTop="@+id/textView1" 
        android:background="#ddd" 
        android:text="@string/button_back" 
        android:textColor="@color/col_back_view_1" 
        android:textSize="@dimen/preamble_text_size"/>
    
</RelativeLayout>
das LogCat hierzu:

Code:
11-02 12:10:19.196: I/TextToSpeech(22877): Sucessfully bound to com.google.android.tts

11-02 12:10:19.346: D/AndroidRuntime(22877): Shutting down VM

11-02 12:10:19.346: W/dalvikvm(22877): threadid=1: thread exiting with uncaught exception (group=0x40c9b300)

11-02 12:10:19.396: E/AndroidRuntime(22877): [COLOR=Red]FATAL EXCEPTION[/COLOR]: main

11-02 12:10:19.396: E/AndroidRuntime(22877): java.lang.RuntimeException: [COLOR=Red]Unable to start activity [/COLOR]
    ComponentInfo{de.test.check/de.test.check.Check}: android.view.InflateException: 
    Binary [COLOR=Red]XML file line #10: Error inflating class de.test.check.Graphic[/COLOR]
Es würde mich wirklich sehr freuen, wenn mir da jemand weiterhelfen könnte !

Grüsse
ein gefrusteter Manfred Kreuß :confused2:
 
Zurück
Oben Unten