2015-09-19 2 views
0

Может ли кто-нибудь помочь мне создать SurfaceView во фрагменте? Ниже мой код. Он всегда останавливается на линии thr: if (! SurfaceHolder.getSurface(). IsValid()), и я не знаю почему.Не удается создать surfaceView во фрагменте

фрагмент кода:

<pre> 
public class FirstActivity extends Fragment/* implements OnTouchListener*/ { 

    CameraView cameraView; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     /* instantiating the surface view */ 
     cameraView = new CameraView(this.getActivity()); 
     /* setting the listener - this, because it is defined within the activity */ 
//  cameraView.setOnTouchListener(this); 

    } 

// public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//  View v = inflater.inflate(R.layout.lin, null); 
//  
//  cameraView = (CameraView) v.findViewById(R.id.cameraView); 
//  
//  return v; 
// 
// } 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return new CameraView(getActivity()); 
    } 

// @Override 
// public boolean onTouch(View arg0, MotionEvent arg1) { 
//  // TODO Auto-generated method stub 
//  return false; 
// } 

    @Override 
    public void onStart() { 
     super.onStart(); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     cameraView.onResumeCameraView(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     cameraView.onPauseCameraView(); 
    } 

} 
</pre> 

код CameraView:

<pre> 
public class CameraView extends SurfaceView implements Runnable { 
    Thread thread = null; 

    SurfaceHolder surfaceHolder; 
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    Bitmap bitmap; 

    int WIDTH = 320; 
    int HEIGHT = 240; 

    volatile boolean running = false; 


    public CameraView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
     surfaceHolder = getHolder(); 
     bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888/*Bitmap.Config.ALPHA_8*//*Bitmap.Config.RGB_565*/); 
     Log.d("S3", "stworzono bitmape"); 
    } 

    public void onResumeCameraView() { 
     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void onPauseCameraView() { 
     boolean retry = true; 
     running = false; 
     while (retry) { 
      try { 
       thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (running) { 

      if (!surfaceHolder.getSurface().isValid()) { 
       Log.d("S3", "blad"); 
       continue; 
      } 

      Log.d("S3", "dalej"); 
      Canvas canvas = surfaceHolder.lockCanvas(); 

      canvas.drawColor(Color.WHITE); 
      paint.setColor(Color.RED); 
      canvas.drawRect(0, 0, 100, 100, paint); 
      surfaceHolder.unlockCanvasAndPost(canvas); 

     } 
    } 
} 
</pre> 

Спасибо за помощь.

+2

Если «останавливается», вы имеете в виду, что ваше приложение выходит из строя, используйте LogCat для проверки трассировки стека Java, связанной с вашим сбоем: https://stackoverflow.com/questions/23353173/ru -myapp-has-stop-how-can-i-solve-this – CommonsWare

+0

Нет, по остановкам, я имею в виду, что surfaceHolder.getSurface(). isValid() возвращает всегда false. Поэтому он останавливается на этом «если». – user5354725

ответ

1

Используйте SurfaceHolder.addCallback(), чтобы зарегистрировать интерфейс обратного вызова. Он будет уведомлять вас, когда поверхность будет доступна, уничтожена и когда она изменится.

0

Я не вижу в вашем сообщении никакого кода, который ссылается на SurfaceView, объявленный в XML, или добавляет SurfaceView программно к макету. Вам нужно сделать любой из них, или SurfaceView не может быть нарисован.

Чтобы добавить progammatically в onCreateView(...), сделайте следующее:

mCameraView = new CameraView(...); 
ViewGroup myRootLayout = (ViewGroup)findViewById(...) 
myRootLayout.addView(mCameraView); 
+0

Спасибо за ответ. Не могли бы вы рассказать мне, что добавить shoul, потому что я новичок в java и android. – user5354725

+0

Я добавил еще несколько объяснений. SurfaceView - это представление. Его нужно добавить в XML, как и все другие виды. Объявите его в XML или выполните, как я показываю в ответ, и добавьте его программно. Могут быть и другие ошибки, потому что это ваш собственный пользовательский класс, расширяющий SurfaceView структуры, но это общая идея. Если у вас возникли проблемы, упростите проблему и узнайте, как добавить базовый SurfaceView в макет, затем добавьте его в свой собственный класс и добавьте его таким же образом. –

+0

Не могли бы вы рассказать мне, что не так с этим кодом, который я написал? Я все еще пытаюсь, но это не работает:/Что должно быть в файле XML? – user5354725

0

Моя функция onCreateView выглядит:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     RelativeLayout relativeLayout = new RelativeLayout(this.getActivity()); 
     TextView textView = new TextView(this.getActivity()); 
     textView.setText("Simply dummy text"); 

     relativeLayout.addView(textView); 
     relativeLayout.addView(cameraView); 

     return relativeLayout; 
} 

можно создавать и добавлять TextView без каких-либо проблем. Но если я пытаюсь добавить cameraView, приложение выйдет из строя. Зачем? Я создаю функцию cameraView в функции onActivityCreated

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