пользовательский вид не работает при объявлении в XML - PullRequest
1 голос
/ 09 мая 2011

У меня есть приложение, в котором его деятельность имеет внутренний класс, расширяющий представление.класс представления отображает растровое изображение, и все это прекрасно работает.То, что я пытаюсь сделать сейчас, это поместить кнопку в представление, которое отображает растровое изображение.Для этого я сделал оригинальный внутренний класс TouchView отдельным классом.Затем я объявил его в XML-файле в папке макета внутри относительного макета и под кнопкой.я думал, что это даст видимость кнопки, плавающей в верхней части окна.Я получаю следующую ошибку.кто-нибудь знает почему?спасибо

05-09 11:45:22.603: ERROR/AndroidRuntime(12211): Uncaught handler: thread main exiting due to uncaught exception
05-09 11:45:22.613: ERROR/AndroidRuntime(12211): java.lang.NullPointerException
05-09 11:45:22.613: ERROR/AndroidRuntime(12211):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:954)
05-09 11:45:22.613: ERROR/AndroidRuntime(12211):     at android.graphics.Canvas.drawBitmap(Canvas.java:980)
05-09 11:45:22.613: ERROR/AndroidRuntime(12211):     at com.tecmark.TouchView.onDraw(TouchView.java:172)
05-09 11:45:22.613: ERROR/AndroidRuntime(12211):     at android.view.View.draw(View.java:6535)

Код:

public class Jjilapp extends Activity {



    private static final String TAG = "*********jjil";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG, "***********inside oncreate about to set contentview = ");
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.touchview);


    }


}

введите код здесь

class TouchView extends View{


    private File tempFile;
    private byte[] imageArray;
    private Bitmap bgr;
    private Bitmap bm;
    private Bitmap whitebm;
    private Paint pTouch;
    private int centreX = 1;
    private int centreY = 1;
    private int radius = 50;





    public TouchView(Context context, AttributeSet attr) {
        super(context,attr);
    }

    public TouchView(Context context) {
        super(context);

       .........code that gets bitmap and changes it 





}// end of touchView constructor


    public void changePixel(){  


        for (int i=0; i < bgr.getWidth(); ++i) {
            for (int y=0; y < bgr.getHeight(); ++y) {

    if( Math.sqrt( Math.pow(i - centreX, 2) + ( Math.pow(y - centreY, 2) ) ) <= radius ){

                    bgr.setPixel(i,y,Color.rgb(255,255,255));
                }
            }
        }   

        }// end of changePixel()


    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        ......code for touch events
    }//end of onTouchEvent


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

        canvas.drawBitmap(whitebm, 0, 0, null);
        canvas.drawBitmap(bgr, 0, 0, null);
        canvas.drawCircle(centreX, centreY, radius,pTouch);


    }//end of onDraw


}

Макет:

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


   <Button android:text="Button" 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </Button>

  <com.tecmark.TouchView
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 


  </RelativeLayout>

1 Ответ

1 голос
/ 09 мая 2011

Измените оба ваших конструктора на

public TouchView(Context context) {
    super(context);
    TouchView(context, null);
}

public TouchView(Context context, AttributeSet attr) {
    super(context,attr);

   .........code that gets bitmap and changes it 

}// end of touchView constructor

Измените xml на этот

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

    <com.tecmark.TouchView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
   <Button
        android:text="Button"
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
    </Button>
</RelativeLayout>
...