I'm making a Android app that basically plays video from a website on the press of a button. As you can see by the code bellow I have 8 different buttons that will play eight different videos. I'm new to programming and this all works fine but I know it's not the best way to write it.
Is there a way I can do the same thing with less lines of code?
package biz.slwdesign.tvlocallysouthdevon;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.VideoView;
public class Watch extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
setContentView(R.layout.watch);
//ImageButton1
ImageButton video1 = (ImageButton) findViewById(R.id.ImageButton1);
video1.setOnClickListener(this);
//ImageButton2
ImageButton video2 = (ImageButton) findViewById(R.id.ImageButton2);
video2.setOnClickListener(this);
//ImageButton3
ImageButton video3 = (ImageButton) findViewById(R.id.ImageButton3);
video3.setOnClickListener(this);
//ImageButton4
ImageButton video4 = (ImageButton) findViewById(R.id.ImageButton4);
video4.setOnClickListener(this);
//ImageButton5
ImageButton video5 = (ImageButton) findViewById(R.id.ImageButton5);
video5.setOnClickListener(this);
//ImageButton6
ImageButton video6 = (ImageButton) findViewById(R.id.ImageButton6);
video6.setOnClickListener(this);
//ImageButton7
ImageButton video7 = (ImageButton) findViewById(R.id.ImageButton7);
video7.setOnClickListener(this);
//ImageButton7
ImageButton video8 = (ImageButton) findViewById(R.id.ImageButton8);
video8.setOnClickListener(this);
}
public void onClick(View v) {
if(v.getId() == R.id.ImageButton1){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/austins.mp4");
videoview1.start();
videoview1.requestFocus();
videoview1.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer videoview) {
}
});
}
if (v.getId() == R.id.ImageButton2){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/brownsWigs.mp4");
videoview1.start();
videoview1.requestFocus();
}
if (v.getId() == R.id.ImageButton3){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/frames&Boxes.mp4");
videoview1.start();
videoview1.requestFocus();
}
if (v.getId() == R.id.ImageButton4){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/hatMckool.mp4");
videoview1.start();
videoview1.requestFocus();
}
if(v.getId() == R.id.ImageButton5){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/gardenTime.mp4");
videoview1.start();
videoview1.requestFocus();
}
if (v.getId() == R.id.ImageButton6){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/paulBarclay.mp4");
videoview1.start();
videoview1.requestFocus();
}
if (v.getId() == R.id.ImageButton7){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/fishShed.mp4");
videoview1.start();
videoview1.requestFocus();
}
if(v.getId() == R.id.ImageButton8){
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath("http://slwdesign.biz/android/offBoutique.mp4");
videoview1.start();
videoview1.requestFocus();
}
}
}
in xml file,set this attribute android:onClick="onClick" instead of initialize ImageButton instance
give some advice:
1.use Map to save the id and video url.
//init the video url map in onCreate method
videoMap = new HashMap<Integer, String>();
videoMap.put(R.id.ImageButton1, "http://slwdesign.biz/android/austins.mp4");
...
//then init the onClickListener
Set<Integer> idSets = videoMap.keySet();
for(int id:idSets){
ImageButton button = (ImageButton)findViewById(id);
button.setOnClickListener(this);
}
//only init once
videoview1 = (VideoView) findViewById(R.id.videoView1);
also, if you in the xml, set the android:onClick="onClick"
, the loop onClickListener
init can be cancel.
2.onClick method:
//onclick
String url = videoMap.get(v.getId());
if(url!=null){
videoview1.setMediaController(new MediaController(this));
videoview1.setVideoPath(url);
videoview1.start();
videoview1.requestFocus();
}
You can shorten your code for example that way:
Create a HashMap<Integer, String>
(probably static
) that links the R.id.*
to the videoPath
. Then iterate over the keyset to setOnClickListener
s and in onClick
do a lookup of the path based on the ID.
Edit: about that way
private static final LinkedHashMap<Integer, String> ID_MAP = new LinkedHashMap<Integer, String>();
static {
ID_MAP.put(R.id.button1, "http://video1.avi");
ID_MAP.put(R.id.button2, "http://video2.avi");
ID_MAP.put(R.id.button3, "http://video3.avi");
ID_MAP.put(R.id.button4, "http://video4.avi");
ID_MAP.put(R.id.button5, "http://video5.avi");
}
private final Button[] mButtons = new Button[ID_MAP.size()];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int i = 0;
for (int id : ID_MAP.keySet()) {
mButtons[i] = (Button) findViewById(id);
mButtons[i].setOnClickListener(this);
i++;
}
}
@Override
public void onClick(View v) {
int id = v.getId();
String url = ID_MAP.get(id);
// set url etc
}
You can save some lines of code this way.
package biz.slwdesign.tvlocallysouthdevon;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.VideoView;
public class Watch extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
setContentView(R.layout.watch);
//ImageButton1
ImageButton video1 = (ImageButton) findViewById(R.id.ImageButton1);
video1.setOnClickListener(this);
//ImageButton2
ImageButton video2 = (ImageButton) findViewById(R.id.ImageButton2);
video2.setOnClickListener(this);
//ImageButton3
ImageButton video3 = (ImageButton) findViewById(R.id.ImageButton3);
video3.setOnClickListener(this);
//ImageButton4
ImageButton video4 = (ImageButton) findViewById(R.id.ImageButton4);
video4.setOnClickListener(this);
//ImageButton5
ImageButton video5 = (ImageButton) findViewById(R.id.ImageButton5);
video5.setOnClickListener(this);
//ImageButton6
ImageButton video6 = (ImageButton) findViewById(R.id.ImageButton6);
video6.setOnClickListener(this);
//ImageButton7
ImageButton video7 = (ImageButton) findViewById(R.id.ImageButton7);
video7.setOnClickListener(this);
//ImageButton7
ImageButton video8 = (ImageButton) findViewById(R.id.ImageButton8);
video8.setOnClickListener(this);
}
public void onClick(View v) {
setContentView(R.layout.watch);
VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
videoview1.setMediaController(new MediaController(this));
if(v.getId() == R.id.ImageButton1){
videoview1.setVideoPath("http://slwdesign.biz/android/austins.mp4");
}
if (v.getId() == R.id.ImageButton2){
videoview1.setVideoPath("http://slwdesign.biz/android/brownsWigs.mp4");
}
if (v.getId() == R.id.ImageButton3){
videoview1.setVideoPath("http://slwdesign.biz/android/frames&Boxes.mp4");
}
if (v.getId() == R.id.ImageButton4){
videoview1.setVideoPath("http://slwdesign.biz/android/hatMckool.mp4");
}
if(v.getId() == R.id.ImageButton5){
videoview1.setVideoPath("http://slwdesign.biz/android/gardenTime.mp4");
}
if (v.getId() == R.id.ImageButton6){
videoview1.setVideoPath("http://slwdesign.biz/android/paulBarclay.mp4");
}
if (v.getId() == R.id.ImageButton7){
videoview1.setVideoPath("http://slwdesign.biz/android/fishShed.mp4");
}
if(v.getId() == R.id.ImageButton8){
videoview1.setVideoPath("http://slwdesign.biz/android/offBoutique.mp4");
}
videoview1.start();
videoview1.requestFocus();
}
Hope I haven't overlooked something.
Definitely the best way is to define the On Click
in the layout XML, you have to write an On Click
method for every button this way for me is more clear than the lot of conditional, then never write the same lines of code twice or more group them in a method, then call the method from where is needed.
I´d rather use switch, case for your type of code instead of the if statment. Regards.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.