2012-06-12 3 views
0

Ниже приведен код main activity class. Он устанавливает контент main.xml, который включает в себя кнопку btn. Когда эта кнопка нажата, содержимое установлено на pic.xml, которое имеет две кнопки: btn1 и btn2. Когда нажата кнопка btn1, она должна установить содержимое на main.xml, но этого не происходит.Слушатель событий не работает

package com.asin.amit; 

import java.io.BufferedOutputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 



import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.PixelFormat; 


import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.MediaController; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class AsinActivity extends Activity { 
/** Called when the activity is first created. */ 
private TextView tv ; 
private VideoView myVideoView; 
private Button btn; 
private Button btn1; 
private Button btn2; 


@Override 


public void onCreate(Bundle savedInstanceState) { 


    try { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     btn = (Button) findViewById(R.id.b); 
     btn1 = (Button) findViewById(R.id.button1); 
     btn2 = (Button) findViewById(R.id.button2); 

     String str= "/sdcard/DCIM/a.mp4"; 


     tv = (TextView) findViewById(R.id.tv1); 


     myVideoView = (VideoView)findViewById(R.id.myvideoview); 
     myVideoView.setVideoPath(str); 
     myVideoView.setMediaController(new MediaController(this)); 
     myVideoView.requestFocus(); 
     myVideoView.start(); 


     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       myVideoView.pause();       
       setContentView(R.layout.pic); 
      }         
     }); 

     btn1.setOnClickListener(new ButtonListener()); 


    } 
    catch (Exception e) { 
     // handle any errors 
     Log.e("HelloWorld", "1", e); // log the error 
     // Also let the user know something went wrong 
     Toast.makeText(
       getApplicationContext(), 
       e.getClass().getName() + " " + e.getMessage(), 
       Toast.LENGTH_LONG).show(); 
    } 
} 

class ButtonListener implements View.OnClickListener{ 
    @Override 
    public void onClick(View v) { 

     setContentView(R.layout.main); 
    } 
} 
} 

На линии btn1.setOnClickListener(new ButtonListener());, LogCat говорит java.lang.NullPointerException

Что не так я делаю?

+1

Вы уверены, что есть 'Button' с _id_' R.id.button1' на 'R.layout.main'? –

+0

Кроме того, попробуйте: if (myVideoView! = Null) myVideoView.pause(); или окружить его попыткой/уловкой – Guardanis

+0

@ K-ballo no, button1 находится в pic.xml –

ответ

0

Согласно тому, что вы написали, When this button is clicked, content is set to pic.xml, which has two buttons, btn1 and btn2 ваш btn1 и btn2 расположены в R.layout.pic, но ваш пытаются найти их в R.layout.main макете по

btn1 = (Button) findViewById(R.id.button1);

btn2 = (Button) findViewById(R.id.button2);

Вы должны установить значение btn1 и btn2 переменных (и onClickListener конечно тоже) только после того, как setContentView(R.layout.pic), вызываете только тогда ваш макет Wil l эти кнопки

0

Использование setContentView() не один раз в действии (почти?) всегда плохая, плохая идея. Вы выбираете кнопку с идентификатором R.id.button1 с вашего макета main.xml в своем onCreate() и устанавливаете прослушиватель этой кнопки. Когда вы звоните setContentView(R.layout.pic), эта кнопка больше не действительна. После настройки просмотра содержимого вам нужно будет сказать btn = (Button)findViewById(R.id.button1). Это всего лишь плохая конструкция, потому что есть так много возможностей для ее разрыва. По какой-либо причине вы не можете просто запустить новую активность с pic.xml в качестве ее содержимого при нажатии кнопки?

+0

в этом упражнении я загружаю видео с sdcard. Если я перейду к другому действию, я должен вернуться, а затем видео нужно перезагрузить, я хотел бы сохранить это время. Кроме того, в этом действии создается изображение, которое отображается в файле pic.xml. Если я создам новую активность для pic.xml, то разве вы не думаете, что передача объекта изображения потребует много времени? –

+0

может предложить несколько способов, так что мне не нужно перезагружать видео? –