Hallo hilfsbereite Community,
ich bin es mal wieder. Ich beschäftige mich immernoch mit spiweview bzw. fragments. Momentan habe ich folgendes Problem: Ich habe eine schlichte app geschrieben, womit man ein sounddatei mittels play-buttons abspielen lässt. die app hat eine swipe-view, das heißt, eine sichtweise wo sich die buttons befinden (play,stop,exit) und eine andere sichtweise, wo die metadaten von der sounddatein also sprich song-interpreter, song-name, song-dauer, song-cover etc. wiedergegeben werden. zwischen diesen sichtweisen kann man wechselns indem man den aktuellen layout festhält und nach rechts oder links zieht (sollte eigentlich klar sein). Ergänzung: die sichtweise wo die metadaten angezeigt werden beinhaltet noch eine seekbar, welches sich bewegt, wenn ein song abgespielt wird.
wie weit bin ich?
momentan kann ich die sounds abspielen und alle metadaten werden angezeigt. ohne fehlermeldungen etc. auch die seekbar funzt soweit ganz gut.
was möchte ich?
ich möchte nun die parameter current_Time (aktuelle zeit/stelle des songs) und current_Duration (gesamtzeit des songs) angeben.
und zwar sobald auf play gedrückt wird und der song abgespielt wird bis zum ende des songs, soll die zeiten angezeigt werden, wobei current_time jede sekunde halt hochgezählt werden soll
wo liegt das problem?
ich weiß es leider nicht
ich habe ein anderes projekt wo ich keine spwipe-view bzw. fragments nutze und dort funktioniert alles wunderbar.
hier sind die codes bzw. fehlermeldungen:
public static class SongParameterFragment extends Fragment implements FragmentCommunicator {
public SeekBar seekBar;
SeekbarHelper seekBarHelper;
private String activityAssignedValue ="";
static int fragmentNR;
public ImageView cover;
public TextView songParameter, songDuration;
runnableTimeline timelineMonitor;
private final Handler handler = new Handler();
public SongParameterFragment(int position) {
this.fragmentNR = position;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(com.example.swipeview3.R.layout.song_parameters, container, false);
cover = (ImageView)v.findViewById(com.example.swipeview3.R.id.imageView1);
songParameter = (TextView)v.findViewById(com.example.swipeview3.R.id.textView_SongParameter);
songDuration = (TextView)v.findViewById(com.example.swipeview3.R.id.textView_SongDuration);
seekBar = (SeekBar)v.findViewById(com.example.swipeview3.R.id.seekBar);
seekBar.setOnSeekBarChangeListener(seekBarChangeListener);
timelineMonitor = new runnableTimeline();
Thread thread = new Thread(timelineMonitor);
thread.start();
return v;
}
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
if(MainActivity.mp != null){
int totalDuration = MainActivity.mp.getDuration();
int currentDuration = totalDuration * progress/100;
MainActivity.mp.seekTo(currentDuration);
}
}
}
};
private class runnableTimeline implements Runnable{
@Override
public void run() {
while(true){
if(MainActivity.mp != null){
int totalDuration = MainActivity.mp.getDuration();
int currentDuration = MainActivity.mp.getCurrentPosition();
int currentTime = (int)(100 * currentDuration/totalDuration);
seekBar.setProgress(currentTime);
// Displaying Total Duration time
songDuration.setText("" + currentDuration + " / "
+ totalDuration);
// handler.postDelayed(timelineMonitor, 100);
}
else {
seekBar.setProgress(0);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@Override
public void passDataToFragment(String someValue) {
activityAssignedValue = someValue;
songParameter.setText(someValue);
}
}
}
Alles anzeigen
Fehlermeldung:
02-05 09:50:59.718: V/MediaPlayer(28056): getDuration
02-05 09:50:59.718: V/MediaPlayer-JNI(28056): getDuration: 106318 (msec)
02-05 09:50:59.718: V/MediaPlayer-JNI(28056): getCurrentPosition: 340 (msec)
02-05 09:50:59.718: W/dalvikvm(28056): threadid=11: thread exiting with uncaught exception (group=0x40c571f8)
02-05 09:50:59.733: E/AndroidRuntime(28056): FATAL EXCEPTION: Thread-32670
02-05 09:50:59.733: E/AndroidRuntime(28056): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4286)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:885)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.view.View.requestLayout(View.java:12881)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.widget.TextView.checkForRelayout(TextView.java:7184)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.widget.TextView.setText(TextView.java:3513)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.widget.TextView.setText(TextView.java:3369)
02-05 09:50:59.733: E/AndroidRuntime(28056): at android.widget.TextView.setText(TextView.java:3344)
02-05 09:50:59.733: E/AndroidRuntime(28056): at com.example.swipeview3.MainActivity$SongParameterFragment$runnableTimeline.run(MainActivity.java:308)
02-05 09:50:59.733: E/AndroidRuntime(28056): at java.lang.Thread.run(Thread.java:856)
Alles anzeigen
current_time und -duration müssen natürlich noch dementsrpechend für eine vernünftige zeitangabe umgerechnet werden, das weiß ich. es geht lediglich darum, dass, wenn ich sobald songDuration.setText("" + currentDuration + " / " + totalDuration); in die
runnableTimeline-klasse eingebe diese fehlermeldung bekomme. das passiert nachdem ich auf den play-button klicke. die musik wird zwwar abgespielt, aber die app friert ein und stürzt letztendlich ab. nehme ich diese raus, wird zwar keine duration angezeigt, aber die app funktioniert wenigstens dann ohne fehlermeldung und absturz. aus der fehlermeldung werde ich auch nicht schlau. hat jmd. eine idee oder ratschlag woran das liegen könnte oder wie man das realisieren kann? würde mich für jede hilfe sehr freuen. danke im voraus