2013-05-28 3 views
0

У меня есть класс внутри класса, который простирается SurfaceView как это:Связывание вложенного класса SurfaceView внутри XML

MainActivity.java

public class MainActivity extends Activity implements OnTouchListener { 

    SurfaceTest mySurface; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.surface); 
     mySurface = (SurfaceTest) findViewById(R.layout.surface); 
     mySurface.setOnTouchListener(this); 
    } 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     // TODO Auto-generated method stub 
     // ... some code ... 
     return true; 
    } 
    public class SurfaceTest extends SurfaceView implements Runnable { 

     SurfaceHolder myHolder; 

     public SurfaceTest(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
      myHolder = getHolder(); 
     } 

     public SurfaceTest(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      // TODO Auto-generated constructor stub 
      myHolder = getHolder(); 
     } 

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

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while (true) { 
       if (!myHolder.getSurface().isValid()) { 
        continue; 
       } 
       Canvas canvas = myHolder.lockCanvas(); 
       //...some code... 
       myHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

surface.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <com.example.testsurfaceview.MainActivity.SurfaceTest 
     android:id="@+id/surfaceView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

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

</FrameLayout> 

У меня есть ошибка в графическом макете этого файла xml:

"The following classes could not be instantiated: 
- com.example.testsurfaceview.MainActivity.SurfaceTest" 

Одно из возможных решений, которые работали для меня, чтобы создать новый класс для SurfaceTest класса, а затем с помощью com.example.testsurfaceview.SurfaceTest в XML-файле.

Но проблема снова заключается в том, что я использую много информации из onTouch событий, которая используется для рисования на холсте в методе run(). Именно по этой причине я реализовал SurfaceTest класс внутри MainActivity

Так у меня есть два варианта прямо сейчас:

1) делают XML работу для вложенной SurfaceTest класса 2) создать новый класс SurfaceTest и передавать всю информацию, полученную в onTouch используя намерение.

Что вы предлагаете?

ответ

1

Создайте в своем пакете файл класса с именем SurfaceTest и добавьте его в свой XML-файл. Это, безусловно, будет работать. Добавьте onDraw(Canvas canvas) и onTouchEvent(MotionEvent event) в ваш Surface View class.

+0

Итак, я поместил все события «переменные» и «onTouch» в другой класс «SurfaceTest» ... okay..lets. Я вернусь, чтобы вы знали результат. :) Спасибо за предложение @Karan –

+0

Я застрял в еще одном poblem при реализации вышеуказанной настройки. Как вы сказали, я создал новый класс «SurfaceTest», а в «MainActivity» я объявил «SurfaceTest mySurface» и в onCreate() 'mySurface = new SurfaceTest (this);' но как насчет 'mySurface.setOnTouchListener (this);' где это сделать сейчас? Извините, я не очень хорошо знаком с Android-программированием. –

+0

добавьте класс SurfaceTest в ваш XML-файл MainActivty (для какого региона требуется перемещение поверхностного объекта) и удалите все объявления SurfaceTest из класса MainActivity. –

Смежные вопросы