- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经构建了一个带有 swipeview 的音乐播放器项目(2 个 fragment )。一个 fragment 有开始按钮,当我点击开始按钮时,另一个 fragment 显示歌曲的元数据信息,还有一个搜索栏。我的问题是在播放歌曲时通过歌曲获取当前时间。
fragment 的代码如下所示:
public static class SongParameterFragment extends Fragment {
public SeekBar seekBar;
static int fragmentNR;
public ImageView cover;
public TextView songParameter, songDuration;
runnableTimeline timelineMonitor;
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{
int totalDuration, currentDuration, currentTime;
@Override
public void run() {
while(true){
if(MainActivity.mp != null){
totalDuration = MainActivity.mp.getDuration();
currentDuration = MainActivity.mp.getCurrentPosition();
currentTime = (int)(100 * currentDuration/totalDuration);
seekBar.setProgress(currentTime);
}
else {
seekBar.setProgress(0);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这段代码工作正常。但是当我想显示歌曲的当前时间(或歌曲进度的时间)时,我将代码 songDuration.setText(currentTime);
放在 run() 方法中 seekBar.setProgress(currentTime);
并得到以下错误消息:
E/AndroidRuntime(10902): FATAL EXCEPTION: Thread-33702
E/AndroidRuntime(10902): android.content.res.Resources$NotFoundException: String resource ID #0x0
E/AndroidRuntime(10902): at android.content.res.Resources.getText(Resources.java:260)
E/AndroidRuntime(10902): at android.widget.TextView.setText(TextView.java:3680)
E/AndroidRuntime(10902): at com.example.swipeview3.MainActivity$SongParameterFragment$runnableTimeline.run(MainActivity.java:311)
E/AndroidRuntime(10902): at java.lang.Thread.run(Thread.java:856)
有人有解决方案的想法或建议吗?提前谢谢
编辑 1:大家好,这是错误消息,当我更改 currentDuration.setText(""+ currentTime);
中的代码 currentDuration.setText(currentTime);
以及 currentDuration.setText(Integer.toString(currentTime));
错误消息是:
02-05 19:26:32.973: E/AndroidRuntime(14221): FATAL EXCEPTION: Thread-33924
02-05 19:26:32.973: E/AndroidRuntime(14221): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4286)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:885)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.view.View.requestLayout(View.java:12881)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.widget.TextView.checkForRelayout(TextView.java:7184)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.widget.TextView.setText(TextView.java:3513)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.widget.TextView.setText(TextView.java:3369)
02-05 19:26:32.973: E/AndroidRuntime(14221): at android.widget.TextView.setText(TextView.java:3344)
02-05 19:26:32.973: E/AndroidRuntime(14221): at com.example.swipeview3.MainActivity$SongParameterFragment$runnableTimeline.run(MainActivity.java:311)
02-05 19:26:32.973: E/AndroidRuntime(14221): at java.lang.Thread.run(Thread.java:856)
我不认为 currentDuration.setText(currentTime);
行是问题所在。我应该实现处理程序或类似的东西吗?
编辑 2:
public class MainActivity extends FragmentActivity implements ActivityCommunicator {
public static MediaPlayer mp;
SongParameterFragment f2;
PlayerFragment f1;
SectionsPagerAdapter mySectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(com.example.swipeview3.R.layout.main);
mySectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(com.example.swipeview3.R.id.pager);
mViewPager.setAdapter(mySectionsPagerAdapter);
}
public void PlayKlick(View v) {
mp = MediaPlayer.create(getApplicationContext(), com.example.swipeview3.R.raw.music);
mp.start();
f2 = (SongParameterFragment)mySectionsPagerAdapter.getItem(1);
f2.passDataToFragment(loadMp3DataFile());
}
private String loadMp3DataFile() {
......
return mp3_parameter;
}
public void StopKlick(View v) {
mp.stop();
}
public void ExitKlick(View v) {
mp.stop();
this.finish();
}
@Override
public void passDataToActivity(String someValue) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(com.example.swipeview3.R.menu.main, menu);
return true;
}
// ------------------------------#########################------------------------------
// ------------------------------#########################------------------------------
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private PlayerFragment f1;
private SongParameterFragment f2;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if(position == 0) {
if (f1 == null) {
f1 = new PlayerFragment(position);
}
return f1;
}
else {
if (f2 == null) {
f2 = new SongParameterFragment(position);
}
return f2;
}
}
@Override
public int getCount() {
// Show 2 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(com.example.swipeview3.R.string.title_section1).toUpperCase();
case 1:
return getString(com.example.swipeview3.R.string.title_section2).toUpperCase();
}
return null;
}
}
// ------------------------------#########################------------------------------
// ------------------------------#########################------------------------------
public class PlayerFragment extends Fragment {
int fragmentNR;
public Button btnPlay, btnStop, btnExit;
public MediaPlayer mp;
public PlayerFragment(int position) {
this.fragmentNR = position;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e("Test", "hello");
//position = getArguments().getInt("position");
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(com.example.swipeview3.R.layout.player, container, false);
btnPlay = (Button)v.findViewById(com.example.swipeview3.R.id.button_play);
btnStop = (Button)v.findViewById(com.example.swipeview3.R.id.button_stop);
btnExit = (Button)v.findViewById(com.example.swipeview3.R.id.button_exit);
return v;
}
}
// ------------------------------#########################------------------------------
// ------------------------------#########################------------------------------
public static class SongParameterFragment extends Fragment {
public SeekBar seekBar;
static int fragmentNR;
public ImageView cover;
public TextView songParameter, songDuration;
runnableTimeline timelineMonitor;
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{
int totalDuration, currentDuration, currentTime;
@Override
public void run() {
while(true){
if(MainActivity.mp != null){
totalDuration = MainActivity.mp.getDuration();
currentDuration = MainActivity.mp.getCurrentPosition();
currentTime = (int)(100 * currentDuration/totalDuration);
seekBar.setProgress(currentTime);
Line 311: songDuration.setText("" + currentTime);
}
else {
seekBar.setProgress(0);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
没人知道吗? :/
最佳答案
您的当前时间是一个 int 值。 Android 将该 int 检测为资源。所以,你可以把 setText(""+ currentTime).这样,它将作为字符串处理,可能会解决您的问题。
关于 fragment 中的 Android Resources$NotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713601/
我正在使用 CustomMultiAutoCompleteTextView 引用 this 选择多个联系人在该代码中选择多个联系人,但我想显示在 toast 消息上选择的数字是什么。当为此单击按钮时,
我想改变我的 snackbar 的颜色 snackbarView.setBackgroundColor(ContextCompat.getColor(context, Color.RED)); 我得到
E/AndroidRuntime( 5751): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exam
我已经用maven构建了我的项目所有构建成功并且 eclipse 属性生成也成功 但是当我在 Eclipse 4 中打开项目时,出现此错误 An internal error occurred dur
我刚刚学习了 Android 编码,这是一个简单的除法、乘法、加法和减法应用程序的源代码,该应用程序在我和我 friend 的 Android 手机上崩溃(在 Lenovo A390 和 Nexus
这是我的 .java 文件: package com.example.rohitkulkarni.readingfile; import android.os.Environment; import
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
我正在使用 zxing 解码二维码图像,但它总是返回 NotFoundException。在线解码器 http://zxing.org/w/decode.jspx扫描这些图像非常好,所以它应该能够在我
我注意到我的华为手机生产应用的许多崩溃报告与复数处理完全相关。其他手机没有这个问题只有华为才有。 所有复数形式都存在并且在其他设备上也能正常工作。 看来华为根本无法处理复数: android.cont
我有一个拥有超过 100.000 名用户的应用程序。但是在某些设备(~50)上我得到了一个奇怪的异常。堆栈跟踪显示,未找到可绘制对象。 这是堆栈跟踪: java.lang.RuntimeExcepti
我尝试使用 Zxing 来解码 Aztec 代码。 我使用来自 SO answer 的代码.这是其中的一部分: public static String readQRCode(String fileP
我正在创建一个应用程序,玩家可以在该应用程序中将自己的名字输入到编辑文本中。此信息被检索并通过 extras 发送到第二个 Activity 。每当我运行它时,我都会收到 Resources$NotF
我尝试构建 apk 的发布版本并在 Honor 5x (api 23) 上启动时出现错误: Caused by: android.view.InflateException: Binary XML f
我的一个应用在三星 S5(准确地说是 SM G900V)上崩溃了,但有以下异常(exception): android.content.res.Resources$NotFoundException:
我收到来自 android 市场的崩溃报告: android.content.res.Resources$NotFoundException: Resource ID #0x.... 我每周会收到大约
我有一个动态功能模块,它有自己的嵌套导航图。我还有一个动态功能模块,它只是一个 fragment 。如果您有一个带有自己导航图的动态功能模块,我知道您需要使用 包含动态标签。当我构建应用程序并将应用程
我的选项菜单中有一个麦克风按钮。当我单击它时,我希望它显示备用图像(红色麦克风)。 但是它不起作用。失败并出现 ResourcesNotFoundException。图像(png)肯定位于适当的 re
我正在循环显示近 4,000 张带有图像名称的图像。 这是我用来从可绘制文件夹获取图像的代码 for(int i=0; i
我试图扩展一个RelativeLayout对象并包含一个嵌入的SurfaceView对象,该对象使用/res/drawable文件夹中的png文件作为背景,但我在XML布局编辑器中不断收到错误。请参阅
崩溃发生在不同设备、不同 Android 版本的总用户中的 0.1%。 android.content.res.Resources$NotFoundException: at android.co
我是一名优秀的程序员,十分优秀!