R.id.tabcontent报错的一些问题

对项目做一些简单的框架搭建仍然是用的以前自己写的布局框架。在使用AndroidStudio的时候发现
android.support.v4.app.FragmentTabHost这个方法除了一些问题。如下:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical" >  

        <FrameLayout  
            android:id="@+id/realtabcontent"  
            android:layout_width="match_parent"  
            android:layout_height="0dip"  
            android:layout_weight="1" />  

        <android.support.v4.app.FragmentTabHost  
            android:id="@android:id/tabhost"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:background="@drawable/bottom_bg" >  

            <TabWidget  
                android:id="@android:id/tabs"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:background="#000000"  
                android:orientation="horizontal" />  
        </android.support.v4.app.FragmentTabHost>  

    </LinearLayout>  

之后在网上找到了一篇博客,问题解决:http://blog.youkuaiyun.com/deng0zhaotai/article/details/48295285

这边文章真心难找,在百度的搜索方式不一样,一般是搜索R.id.tabcontent的错误日志,这里是
“fragmenttabhost在新版v4包中”才能搜到这篇文章,我一开始也没想到是新V4包的版本问题,
因为androidstudio是最新下载的,创建项目的时候V4包自动使用最新的,所以我以前使用的V4
包是没这个bug的,而新版中暴露了出来,尝试使用了最新的android.support.design.widget.TabLayout,发现有Bug,当标签栏在底部时,系统会先加载内容页,
而不加载标签页,网上说开一个线程来手动加载标签页,我试了一下还是不行。。。如果有人成功了
麻烦告诉我方法,非常感谢!
这里对上述引用的博客再做一些补充。
博客所说的最后一个代码片段描述如下:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical" >  

        <FrameLayout  
            android:id="@+id/realtabcontent"  
            android:layout_width="match_parent"  
            android:layout_height="0dip"  
            android:layout_weight="1" />  

        <android.support.v4.app.FragmentTabHost  
            android:id="@android:id/tabhost"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:background="@drawable/bottom_bg" >  
        </android.support.v4.app.FragmentTabHost>  

    </LinearLayout>  

遮挡的问题,在

<android.support.v4.app.FragmentTabHost ><<android.support.v4.app.FragmentTabHost />

这段代码中少了TabWidget这个控件,添加进去之后,按照其所说自定义了framelayout的id
代码中进行相应的更改,可仍然是不行的,提示“R.id.content XXXXXX”错误,我这里直接用的
倒数第二个代码段:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical" >  

        <android.support.v4.app.FragmentTabHost  
            android:id="@android:id/tabhost"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content" >  

            <FrameLayout  
                android:id="@android:id/tabcontent"  
                android:layout_width="match_parent"  
                android:layout_height="match_parent" />  

            <TabWidget  
                android:id="@android:id/tabs"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:layout_alignParentBottom="true"  
                android:layout_gravity="bottom"  
                android:background="#B0C4DE"  
                android:orientation="horizontal"  
                android:showDividers="middle" />  
        </android.support.v4.app.FragmentTabHost>  

    </LinearLayout>  

关于这个布局会导致覆盖掉TabWidget控件的问题,我这里在TabWidget所包含既一个标签布局中,
使用了warpcontent,然后将TabWidget控件修改:android:layout_height=”40dp”。一般底部标签
不会有多大,所以这里直接定义了一个比较高的dp值,一般是没什么问题的。如果有完美解决覆盖
问题的请告诉我,谢谢~

请帮我优化以下代码: 主布局文件:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tool="http://schemas.android.com/tools" android:orientation="vertical" tools:context=".Fragment.Fragment_main"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager.widget.ViewPager android:id="@+id/myviewpage" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/view" android:background="#f0f0f0"/> <View android:id="@+id/view" android:layout_width="wrap_content" android:layout_height="1dp" android:layout_above="@+id/bot_z" android:background="#f0f0f0" tool:layout_editor_absoluteX="419dp" tool:layout_editor_absoluteY="39dp" /> <LinearLayout android:id="@+id/bot_z" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true"> <TextView android:id="@+id/T1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="首页" android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/T2" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="订单" android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/T3" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="我的" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout> </RelativeLayout> </LinearLayout> 分布局文件:lout1:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:src="@drawable/mm001" /> </LinearLayout> lout2:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:src="@drawable/mm001"/> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="zhehsi page2" /> </LinearLayout> lout3:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:src="@drawable/mm001" /> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="zhehsi page3" /> </LinearLayout> 主main.java:package com.example.myapplication.Fragment; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.viewpager.widget.ViewPager; import com.example.myapplication.R; import com.example.myapplication.Viewpagerhd.Mypageradapter; import java.util.ArrayList; import java.util.List; public class Fragment_main extends AppCompatActivity implements View.OnClickListener { private Fragment fragment1, fragment2, fragment3; private TextView tab1, tab2, tab3; private ViewPager myViewpager; private List<Fragment> fragmentList; private Mypageradapter mypageradapter; private Fragment currentFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment1); initUI(); // initFragments(); initTab(); } private void initTab() { Fragmenta_1 fragmenta_1 = new Fragmenta_1(); Fragmenta_2 fragmenta_2 = new Fragmenta_2(); Fragmenta_3 fragmenta_3 = new Fragmenta_3(); fragmentList = new ArrayList<Fragment>(); fragmentList.add(fragmenta_1); fragmentList.add(fragmenta_2); fragmentList.add(fragmenta_3); mypageradapter = new Mypageradapter(getSupportFragmentManager(),fragmentList); myViewpager .setAdapter(mypageradapter); myViewpager.addOnAdapterChangeListener(new MyPageChangeListennr()); showFragment(0); } private void showFragment(int i) { myViewpager.setCurrentItem(i); if (i == 0){ tab1.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (i==1){ tab2.setBackgroundColor(Color.RED); tab1.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (i==2){ tab3.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab1.setBackgroundColor(Color.WHITE); } } public class MyPageChangeListennr implements ViewPager.OnPageChangeListener { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position==0){ tab1.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (position==1){ tab2.setBackgroundColor(Color.RED); tab1.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (position==2){ tab3.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab1.setBackgroundColor(Color.WHITE); } } @Override public void onPageScrollStateChanged(int state) { } } private void initUI() { tab1 = findViewById(R.id.T1); tab2 = findViewById(R.id.T2); tab3 = findViewById(R.id.T3); tab1.setOnClickListener(this); tab2.setOnClickListener(this); tab3.setOnClickListener(this); myViewpager =(ViewPager) findViewById(R.id.myviewpage); // updateTabColors(R.id.T1); } // private void initFragments() { // FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // // // 按顺序添加所有Fragment // fragment1 = new Fragmenta_1(); // fragment2 = new Fragmenta_2(); // fragment3 = new Fragmenta_3(); // // transaction.add(R.id.view_pager, fragment1, "1"); // transaction.add(R.id.view_pager, fragment2, "2"); // transaction.add(R.id.view_pager, fragment3, "3"); // // transaction.hide(fragment2); // transaction.hide(fragment3); // transaction.commitNow(); // 立即提交事务 // // currentFragment = fragment1; // } @Override public void onClick(View v) { if (v.getId()==R.id.T1) { showFragment(0); }else if (v.getId()==R.id.T2){ showFragment(1); }else if (v.getId()==R.id.T3){ showFragment(2); } } private void switchFragment(Fragment targetFragment, int tabId) { if (targetFragment == currentFragment) return; FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); transaction.hide(currentFragment); transaction.show(targetFragment); transaction.commitNow(); // 使用立即提交 currentFragment = targetFragment; updateTabColors(tabId); } private void updateTabColors(int selectedTabId) { int defaultColor = Color.WHITE; int selectedColor = Color.RED; tab1.setBackgroundColor(selectedTabId == R.id.T1 ? selectedColor : defaultColor); tab2.setBackgroundColor(selectedTabId == R.id.T2 ? selectedColor : defaultColor); tab3.setBackgroundColor(selectedTabId == R.id.T3 ? selectedColor : defaultColor); } } 适配器java: package com.example.myapplication.Fragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import java.util.List; public class MypageAdaper extends FragmentPagerAdapter { private List<Fragment> fragmentList; public MypageAdaper(FragmentManager fm) { super(fm); } public MypageAdaper(FragmentManager fm,List<Fragment>fragmentList) { super(fm); this.fragmentList=fragmentList; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } } Fragmenta_1. java:package com.example.myapplication.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; import com.example.myapplication.R; public class Fragmenta_1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.lout1,container,false); return view; } } Fragmenta_2 .java:package com.example.myapplication.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; import com.example.myapplication.R; public class Fragmenta_2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.lout2,container,false); return view; } } Fragmenta_3.java:package com.example.myapplication.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; import com.example.myapplication.R; public class Fragmenta_3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.lout3,container,false); return view; } } 报错:错误: 无法将类 Mypageradapter中的构造器 Mypageradapter应用到给定类型; 需要: List<View> 找到: FragmentManager,List<Fragment> 原因: 实际参数列表和形式参数列表长度不同 错误: 不兼容的类型: Fragment_main.MyPageChangeListennr无法转换为OnAdapterChangeListener
05-31
现在是在datepicker_layout.xml代码完全一致的前提下,在代码WeatherInfoActivity和FanHui代码中使用的datepicker_layout时间选择器显示的布局样式还是完全不一样,给我直接一次性解决布局样式完全不一样的问题。WeatherInfoActivity:package com.jd.projects.wlw.weatherinfo; import static com.jd.projects.wlw.weatherinfo.AllInfoMap.KEY_SITE_INFO; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.Display; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.TimePicker; import com.jd.projects.wlw.DeviceMapActivity; import com.jd.projects.wlw.R; import com.jd.projects.wlw.bean.MapDataBean; import com.jd.projects.wlw.bean.new_webservice.MapDataBeanNew; import com.jd.projects.wlw.fragment.CureDataFragment; import com.jd.projects.wlw.fragment.HistoryDataFragment; import com.jd.projects.wlw.fragment.MonthDataFragment; import com.jd.projects.wlw.fragment.RealTimeFragment; import com.jd.projects.wlw.fragment.TjfxDataFragment; import com.jd.projects.wlw.update.Utils; import java.text.SimpleDateFormat; import java.util.Calendar; public class WeatherInfoActivity extends FragmentActivity implements OnClickListener { private LinearLayout layout_tqyb, layout_nyqx, layout_nyzx, layout_gdnq, layout_tjfx,layout_location; private ImageView image_ntqx, image_tqyb, image_nyzx, image_gdnq, image_tjfx; private Fragment mContent; public static MapDataBean realdata; // public static String asitename; private Calendar calendar = Calendar.getInstance(); private Context context; private ArrayAdapter<String> spinneradapter; private static final String[] m2 = {"空气温度", "空气湿度", "土壤温度1", "土壤温度2", "土壤温度3", "土壤湿度", "光照度", "蒸发量", "降雨量", "风速", "风向", "结露", "气压", "总辐射", "光合有效辐射"}; private static final String[] m1 = {"空气温度", "空气湿度", "土壤温度1", "土壤温度2", "土壤温度3", "土壤湿度1", "土壤湿度2", "土壤湿度3"}; private String spinnervaluse02; TextView time1; private String nsitetype; private MapDataBeanNew curSiteInfo; private double intentLat = 0.0; private double intentLng = 0.0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wheatherinfo); try { intentLat = getIntent().getDoubleExtra("intentLat", 0.0); intentLng = getIntent().getDoubleExtra("intentLng", 0.0); context = this; //getData(); curSiteInfo = (MapDataBeanNew) getIntent().getSerializableExtra(KEY_SITE_INFO); initView(); if(intentLat == 0 || intentLng == 0){ layout_location.setVisibility(View.GONE); }else{ layout_location.setVisibility(View.VISIBLE); } } catch (Exception e){ Log.d("mcg",e.getMessage()); e.printStackTrace(); } } private void getData() { SharedPreferences preferences = getSharedPreferences("wlw_settings", MODE_PRIVATE); String neiip = preferences.getString("neiip", ""); String mark = preferences.getString("netmode", "");//内网访问还是外网访问? nsitetype = AllInfoMap.nsitetype;// } private void initView() { nsitetype = AllInfoMap.nsitetype;// layout_tqyb = (LinearLayout) findViewById(R.id.tab1); layout_nyqx = (LinearLayout) findViewById(R.id.tab2); layout_nyzx = (LinearLayout) findViewById(R.id.tab3); layout_gdnq = (LinearLayout) findViewById(R.id.tab4); layout_tjfx = (LinearLayout) findViewById(R.id.tab5); layout_location = (LinearLayout) findViewById(R.id.tab6); image_ntqx = (ImageView) findViewById(R.id.image_qixiang);//2 image_tqyb = (ImageView) findViewById(R.id.image_yubao);//1 image_nyzx = (ImageView) findViewById(R.id.image_zixun);//3 image_gdnq = (ImageView) findViewById(R.id.image_gdnq);//4 image_tjfx = (ImageView) findViewById(R.id.image_tjfx);//5 layout_tqyb.setOnClickListener(this); layout_nyqx.setOnClickListener(this); layout_nyzx.setOnClickListener(this); layout_gdnq.setOnClickListener(this); layout_tjfx.setOnClickListener(this); layout_location.setOnClickListener(this); mContent = RealTimeFragment.newInstance(curSiteInfo); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); } @SuppressLint("NonConstantResourceId") @Override public void onClick(View v) { switch (v.getId()) { case R.id.tab1: layout_tqyb.setBackgroundResource(R.drawable.tabshape_bg); layout_nyqx.setBackgroundResource(R.color.transparent); layout_nyzx.setBackgroundResource(R.color.transparent); layout_gdnq.setBackgroundResource(R.color.transparent); layout_tjfx.setBackgroundResource(R.color.transparent); image_tjfx.setImageResource(R.drawable.sh_wxry_rwcx_02); image_nyzx.setImageResource(R.drawable.curve); image_ntqx.setImageResource(R.drawable.history_pic); image_gdnq.setImageResource(R.drawable.disease_pic); image_tqyb.setImageResource(R.drawable.real_pic_on); mContent = RealTimeFragment.newInstance(curSiteInfo); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); break; case R.id.tab2: layout_tqyb.setBackgroundResource(R.color.transparent); layout_nyqx.setBackgroundResource(R.drawable.tabshape_bg); layout_nyzx.setBackgroundResource(R.color.transparent); layout_gdnq.setBackgroundResource(R.color.transparent); layout_tjfx.setBackgroundResource(R.color.transparent); image_tjfx.setImageResource(R.drawable.sh_wxry_rwcx_02); image_gdnq.setImageResource(R.drawable.disease_pic); image_tqyb.setImageResource(R.drawable.real_pic); image_ntqx.setImageResource(R.drawable.history_pic_on); image_nyzx.setImageResource(R.drawable.curve); mContent = HistoryDataFragment.newInstance(curSiteInfo); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); break; case R.id.tab3: showExitGameAlert(); break; case R.id.tab4: layout_tqyb.setBackgroundResource(R.color.transparent); layout_nyqx.setBackgroundResource(R.color.transparent); layout_nyzx.setBackgroundResource(R.color.transparent); layout_gdnq.setBackgroundResource(R.drawable.tabshape_bg); layout_tjfx.setBackgroundResource(R.color.transparent); image_tjfx.setImageResource(R.drawable.sh_wxry_rwcx_02); image_gdnq.setImageResource(R.drawable.disease_pic_on); image_tqyb.setImageResource(R.drawable.real_pic); image_ntqx.setImageResource(R.drawable.history_pic); image_nyzx.setImageResource(R.drawable.curve); mContent = CureDataFragment.newInstance(curSiteInfo); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); break; case R.id.tab5: jinDuJiaozhang(); break; case R.id.tab6: Intent intent = new Intent(WeatherInfoActivity.this, DeviceMapActivity.class); intent.putExtra("intentLat",intentLat); intent.putExtra("intentLng",intentLng); startActivity(intent); break; case R.id.dateselect1: //弹窗日期选择 new MonPickerDialog(context, dateListener1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show(); break; } } private DatePickerDialog.OnDateSetListener dateListener1 = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) { calendar.set(Calendar.YEAR, arg1);// 将给定的日历字段设置为给定值。 //calendar.set(Calendar.MONTH, arg2); //calendar.set(Calendar.DAY_OF_MONTH, arg3); SimpleDateFormat df = new SimpleDateFormat("yyyy"); time1.setText(df.format(calendar.getTime())); } }; /** * 时间选择器 */ @SuppressLint("SimpleDateFormat") private void showExitGameAlert() { final AlertDialog dlg = new AlertDialog.Builder(this).create(); dlg.show(); Window window = dlg.getWindow(); // *** 主要就是在这里实现这种效果的. // 设置窗口的内容页面,shrew_exit_dialog.xml文件中定义view内容 window.setContentView(R.layout.datepicker_layout); // 为确认按钮添加事件,执行退出应用操作 DatePicker dp = (DatePicker) window.findViewById(R.id.dpPicker); final Calendar calendar = Calendar.getInstance(); // final SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月"); final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); // 隐藏日期View ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE); dp.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), (view, year, monthOfYear, dayOfMonth) -> { // 获取一个日历对象,并初始化为当前选中的时间 calendar.set(year, monthOfYear, dayOfMonth); }); RelativeLayout ok = (RelativeLayout) window.findViewById(R.id.YES); ok.setOnClickListener(v -> { layout_tqyb.setBackgroundResource(R.color.transparent); layout_nyqx.setBackgroundResource(R.color.transparent); layout_nyzx.setBackgroundResource(R.drawable.tabshape_bg); layout_gdnq.setBackgroundResource(R.color.transparent); layout_tjfx.setBackgroundResource(R.color.transparent); image_tjfx.setImageResource(R.drawable.sh_wxry_rwcx_02); image_gdnq.setImageResource(R.drawable.disease_pic); image_tqyb.setImageResource(R.drawable.real_pic); image_ntqx.setImageResource(R.drawable.history_pic); image_nyzx.setImageResource(R.drawable.curve_hover); String dataTime = format.format(calendar.getTime()); // 携带数据跳转页面 mContent = new MonthDataFragment(); Bundle bundle = new Bundle(); bundle.putString("datatime", dataTime); bundle.putSerializable(KEY_SITE_INFO, curSiteInfo); mContent.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); dlg.cancel(); }); // 关闭alert对话框架 RelativeLayout cancel = (RelativeLayout) window.findViewById(R.id.NO); cancel.setOnClickListener(v -> dlg.cancel()); } /** * 重写datePicker 1.只显示 年-月 2.title 只显示 年-月 * * @author lmw */ public class MonPickerDialog extends DatePickerDialog { public MonPickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) { super(context, callBack, year, monthOfYear, dayOfMonth); //this.setTitle(year + "年" + (monthOfYear + 1) + "月"); this.setTitle(year + "年"); ((ViewGroup) ((ViewGroup) this.getDatePicker().getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE); ((ViewGroup) ((ViewGroup) this.getDatePicker().getChildAt(0)).getChildAt(0)).getChildAt(1).setVisibility(View.GONE); } @Override public void onDateChanged(DatePicker view, int year, int month, int day) { super.onDateChanged(view, year, month, day); //this.setTitle(year + "年" + (month + 1) + "月"); this.setTitle(year + "年"); } } private void jinDuJiaozhang() { final Dialog myDialog = new Dialog(context); //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0)); myDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); myDialog.show(); // 设置宽度为屏幕的宽度 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = myDialog.getWindow().getAttributes(); lp.width = (int) (display.getWidth()); // 设置宽度 myDialog.getWindow().setAttributes(lp); //myDialog.setCancelable(false);//调用这个方法时,按对话框以外的地方不起作用。按返回键也不起作用 myDialog.setCanceledOnTouchOutside(false);//调用这个方法时,按对话框以外的地方不起作用。按返回键还起作用 Window window = myDialog.getWindow(); window.setContentView(R.layout.dialog_et22);// setContentView()必须放在show()的后面,不然会报错 Spinner sp_01 = (Spinner) window.findViewById(R.id.sp_01); // 将可选内容与ArrayAdapter连接起来 if (nsitetype.equals("01") || !Utils.isOldDevice(curSiteInfo.getId())) { // 十五项因子 spinneradapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, m2); } else if (nsitetype.equals("02")) { // 八项因子 spinneradapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, m1); } // 设置下拉列表的风格 spinneradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 将adapter 添加到spinner中 sp_01.setAdapter(spinneradapter); sp_01.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub /*if (position == 0) { spinnervaluse02 = "卵"; } else if (position == 1) { spinnervaluse02 = "幼虫"; } else if (position == 2) { spinnervaluse02 = "蛹"; } else if (position == 3) { spinnervaluse02 = "成虫"; }*/ if (nsitetype.equals("01") || !Utils.isOldDevice(curSiteInfo.getId())) { // 十五项因子 spinnervaluse02 = m2[position]; } else if (nsitetype.equals("02")) { // 八项因子 spinnervaluse02 = m1[position]; } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); time1 = (TextView) window.findViewById(R.id.time1); LinearLayout dateselect1 = (LinearLayout) window.findViewById(R.id.dateselect1); // 初始化当前时间 updateDate(); dateselect1.setOnClickListener(this); Button btn_ensure = (Button) window.findViewById(R.id.btn_ensure); Button btn_cancel = (Button) window.findViewById(R.id.btn_cancel); btn_ensure.setOnClickListener(v -> { //spinnervaluse02 time1 //统计分析 layout_tqyb.setBackgroundResource(R.color.transparent); layout_nyqx.setBackgroundResource(R.color.transparent); layout_nyzx.setBackgroundResource(R.color.transparent); layout_gdnq.setBackgroundResource(R.color.transparent); layout_tjfx.setBackgroundResource(R.drawable.tabshape_bg); image_tjfx.setImageResource(R.drawable.sh_wxry_rwcx_01); image_gdnq.setImageResource(R.drawable.disease_pic); image_tqyb.setImageResource(R.drawable.real_pic); image_ntqx.setImageResource(R.drawable.history_pic); image_nyzx.setImageResource(R.drawable.curve); mContent =new TjfxDataFragment(); Bundle bundle = new Bundle(); bundle.putString("spinnervaluse", spinnervaluse02); bundle.putString("time1", time1.getText().toString()); bundle.putSerializable(KEY_SITE_INFO,curSiteInfo); mContent.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit(); myDialog.dismiss(); }); btn_cancel.setOnClickListener(v -> { // TODO Auto-generated method stub myDialog.dismiss(); }); } private void updateDate() {//时间控件 SimpleDateFormat df = new SimpleDateFormat("yyyy"); time1.setText(df.format(calendar.getTime())); } } FanHui:package com.videogo.ui.login; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.DatePicker; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.videogo.openapi.EZOpenSDK; import com.videogo.widget.TitleBar; import ezviz.ezopensdk.R; import java.util.Calendar; import java.util.Locale; public class FanHui extends AppCompatActivity { private static final String TAG = "EZPreview"; private String mAppKey; private String mDeviceSerial; private String mVerifyCode; private String mAccessToken; private int mCameraNo; private TextView mDateTextView; private int mSelectedYear, mSelectedMonth, mSelectedDay; private static final String KEY_APPKEY = "appkey"; private static final String KEY_SERIAL = "serial"; private static final String KEY_VERIFYCODE = "VerifyCode"; private static final String KEY_ACCESSTOKEN = "accessToken"; private static final String KEY_CAMERANO = "cameraNo"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ez_playback_list_page); extractParametersFromIntent(); final Calendar calendar = Calendar.getInstance(); mSelectedYear = calendar.get(Calendar.YEAR); mSelectedMonth = calendar.get(Calendar.MONTH); mSelectedDay = calendar.get(Calendar.DAY_OF_MONTH); // 设置日期显示模块 setupDatePicker(); View fanHui = findViewById(R.id.fanhui); fanHui.setOnClickListener(v -> finish()); Button huifangBtn = findViewById(R.id.fanhui); huifangBtn.setOnClickListener(v -> { Intent intent = new Intent(FanHui.this, MainActivity.class); intent.putExtra("deviceSerial", mDeviceSerial); intent.putExtra("cameraNo", mCameraNo); intent.putExtra("accessToken", mAccessToken); intent.putExtra("appkey", mAppKey); intent.putExtra("verifyCode", mVerifyCode); startActivity(intent); }); } private void setupDatePicker() { mDateTextView = findViewById(R.id.date_text); ImageButton datePickerButton = findViewById(R.id.date_picker_button); updateDateDisplay(); datePickerButton.setOnClickListener(v -> showDatePickerDialog()); } private void updateDateDisplay() { String formattedDate = String.format(Locale.getDefault(), "%d年%02d月%02d日", mSelectedYear, mSelectedMonth + 1, // 月份需要+1 mSelectedDay); mDateTextView.setText(formattedDate); } private void showDatePickerDialog() { final AlertDialog dlg = new AlertDialog.Builder(this).create(); dlg.show(); Window window = dlg.getWindow(); window.setContentView(R.layout.datepicker_layout); // 设置对话框宽度 WindowManager.LayoutParams lp = window.getAttributes(); lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 匹配父容器宽度 window.setAttributes(lp); // 初始化日期选择器 DatePicker dpPicker = window.findViewById(R.id.dpPicker); dpPicker.init(mSelectedYear, mSelectedMonth, mSelectedDay, null); // 获取按钮 RelativeLayout yesButton = window.findViewById(R.id.YES); RelativeLayout noButton = window.findViewById(R.id.NO); // 设置确定按钮点击事件 yesButton.setOnClickListener(v -> { mSelectedYear = dpPicker.getYear(); mSelectedMonth = dpPicker.getMonth(); mSelectedDay = dpPicker.getDayOfMonth(); updateDateDisplay(); dlg.dismiss(); }); // 设置取消按钮点击事件 noButton.setOnClickListener(v -> dlg.dismiss()); } private void extractParametersFromIntent() { Bundle extras = getIntent().getExtras(); if (extras != null) { mAppKey = extras.getString(KEY_APPKEY, ""); mDeviceSerial = extras.getString(KEY_SERIAL, ""); mVerifyCode = extras.getString(KEY_VERIFYCODE, ""); mAccessToken = extras.getString(KEY_ACCESSTOKEN, ""); mCameraNo = extras.getInt(KEY_CAMERANO, 0); Log.d(TAG, "Received parameters:"); Log.d(TAG, "AppKey: " + mAppKey); Log.d(TAG, "DeviceSerial: " + mDeviceSerial); Log.d(TAG, "VerifyCode: " + mVerifyCode); Log.d(TAG, "AccessToken: " + mAccessToken); Log.d(TAG, "CameraNo: " + mCameraNo); } else { Log.e(TAG, "No parameters received from intent"); } } }
06-26
package com.weishitech.qichechangtingyinyue; import android.annotation.SuppressLint; import android.content.Intent; import android.view.View; import android.widget.ImageView; import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.hfd.common.util.ToastUtil; import com.umeng.commonsdk.UMConfigure; import com.weishitech.qichechangtingyinyue.adtakubase.activity.BaseBindActivity; import com.weishitech.qichechangtingyinyue.adtakubase.inter.insert.IAdInsertView; import com.weishitech.qichechangtingyinyue.adtakubase.inter.nativ.IAdNativeView; import com.weishitech.qichechangtingyinyue.bean.MusicBean; import com.weishitech.qichechangtingyinyue.bean.MusicCache; import com.weishitech.qichechangtingyinyue.bean.PlayStatusUpdateEvent; import com.weishitech.qichechangtingyinyue.databinding.ActivityMainBinding; import com.weishitech.qichechangtingyinyue.fragment.Adapter.NavigationFragmentAdapter; import com.weishitech.qichechangtingyinyue.fragment.home.LyricsActivity; import com.weishitech.qichechangtingyinyue.fragment.specail.SpecialFragment; import com.weishitech.qichechangtingyinyue.fragment.home.HomeFragment; import com.weishitech.qichechangtingyinyue.fragment.lilv.LiLvFragment; import com.weishitech.qichechangtingyinyue.fragment.tools.ToolsFragment; import com.weishitech.qichechangtingyinyue.fragment.wode.WoDeFragment; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; public class MainActivity extends BaseBindActivity<ActivityMainBinding> implements View.OnClickListener,IAdInsertView, IAdNativeView { private ImageView imgCurrent; //其中定义了四个Fragment,放入ArrayList中 ArrayList<Fragment> fragments = new ArrayList<>(); //五个fragments添加,暂时使用TempFragment页面做页面简单展示 HomeFragment homeFragment; LiLvFragment liLvFragment; SpecialFragment specialFragment; //WeatherFragment weatherFragment; ToolsFragment toolsFragment; WoDeFragment woDeFragment; //int index = 0;//标记当前页码 private List<AppAdEnum> mAdEnumList; @Override protected void init() { // SDK预初始化函数不会采集设备信息,也不会向友盟后台上报数据。 // preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验 UMConfigure.preInit(getApplication(), LCAppcation.umengKey, LCAppcation.channelName); //初始化组件化基础库, 所有友盟业务SDK都必须调用此初始化接口。 //建议在宿主App的Application.onCreate函数中调用基础组件库初始化函数。 UMConfigure.init(getApplication(), LCAppcation.umengKey, LCAppcation.channelName, UMConfigure.DEVICE_TYPE_PHONE, ""); /** *设置组件化的Log开关 *参数: boolean 默认为false,如需查看LOG设置为true */ UMConfigure.setLogEnabled(BuildConfig.DEBUG); mBinding.include.tabNavigationBottomRili.setOnClickListener(this); mBinding.include.tabNavigationBottomLilv.setOnClickListener(this); mBinding.include.tabNavigationBottomSpecail.setOnClickListener(this); mBinding.include.tabNavigationBottomPssb.setOnClickListener(this); mBinding.include.tabNavigationBottomWode.setOnClickListener(this); //默认选中日历 mBinding.include.imgRili.setSelected(true); mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.tab_select)); imgCurrent = mBinding.include.imgRili; //设置不可滑动 mBinding.idViewpager.setUserInputEnabled(false); homeFragment = new HomeFragment(); liLvFragment = new LiLvFragment(); specialFragment = new SpecialFragment(); // toolsFragment = new ToolsFragment(); woDeFragment = new WoDeFragment(); fragments.add(homeFragment); fragments.add(liLvFragment); fragments.add(specialFragment); // fragments.add(toolsFragment); fragments.add(woDeFragment); //装配NavigationFrameworkAdapter适配器 NavigationFragmentAdapter pagerAdapter = new NavigationFragmentAdapter(getSupportFragmentManager(), getLifecycle(), fragments); //绑定适配器 mBinding.idViewpager.setAdapter(pagerAdapter); if (mAdEnumList == null) { mAdEnumList = new ArrayList<>(); } mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB1); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB2); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB3); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB4); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB5); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB1); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB2); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB3); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB4); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB5); setTextColor(0); mBinding.include.imgSong.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, LyricsActivity.class); // 这里需要知道当前播放的是哪首歌 —— 建议配合 MusicCache 或 SharedViewModel 使用 MusicBean.DataBean current = MusicCache.getCurrentPlayingSong(); if (current != null) { intent.putExtra("title", current.getTitle()); intent.putExtra("singer", current.getSinger()); intent.putExtra("cover_url", current.getCover()); intent.putExtra("music_url", current.getMusic()); intent.putExtra("position", current.getPosition()); intent.putExtra("total_count", MusicCache.getTotalCount()); } else { ToastUtil.showShortToast("暂无播放信息"); } }); EventBus.getDefault().register(this); } //页面切换方法,已经包含两种情况,滑动和点击切换 @SuppressLint("NonConstantResourceId") private void changeTab(int position) { imgCurrent.setSelected(false); //在android中使用switch case语句可能会出现报错冒红现象,请看最后的注意事项,可以解决这个问题 switch (position) { case R.id.tab_navigation_bottom_rili: //点击图片后,切换页面 mBinding.idViewpager.setCurrentItem(0,false); setTextColor(0); case 0: //滑动到第一个界面(索引为0)触发被选中效果,即切换图标(从黑→绿) //imgWeChat.setSelected(true)这部分功能请看后面的tab_navigation__bottom部分 mBinding.include.imgRili.setSelected(true); imgCurrent = mBinding.include.imgRili; break; case R.id.tab_navigation_bottom_lilv: mBinding.idViewpager.setCurrentItem(1,false); setTextColor(1); case 1: mBinding.include.imgLilv.setSelected(true); imgCurrent = mBinding.include.imgLilv; break; case R.id.tab_navigation_bottom_specail: mBinding.idViewpager.setCurrentItem(2,false); setTextColor(2); case 2: mBinding.include.imgSpecail.setSelected(true); imgCurrent = mBinding.include.imgSpecail; break; case R.id.tab_navigation_bottom_pssb: mBinding.idViewpager.setCurrentItem(3,false); setTextColor(3); case 3: mBinding.include.imgPssb.setSelected(true); imgCurrent = mBinding.include.imgPssb; break; case R.id.tab_navigation_bottom_wode: mBinding.idViewpager.setCurrentItem(4,false); setTextColor(4); case 4: mBinding.include.imgWode.setSelected(true); imgCurrent = mBinding.include.imgWode; break; } } private void setTextColor(int index){ initInsert(mAdEnumList.get(index)); initNative(mAdEnumList.get(index+fragments.size())); mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvLilv.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvSpecail.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvPssb.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvWode.setTextColor(getResources().getColor(R.color.text_tab)); switch (index){ case 0: mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.tab_select)); break; case 1: mBinding.include.tvLilv.setTextColor(getResources().getColor(R.color.tab_select)); break; case 2: mBinding.include.tvSpecail.setTextColor(getResources().getColor(R.color.tab_select)); break; case 3: mBinding.include.tvPssb.setTextColor(getResources().getColor(R.color.tab_select)); break; case 4: mBinding.include.tvWode.setTextColor(getResources().getColor(R.color.tab_select)); break; } } // 两次点击按钮之间的点击间隔不能少于1000毫秒 private static final long MIN_CLICK_DELAY_TIME = 500; private static long lastClickTime; //点击导航栏时,将图片的ID传入changeTab,触发切换页面事件 @Override public void onClick(View v) { long curClickTime = System.currentTimeMillis(); if((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) { // 超过点击间隔后再将lastClickTime重置为当前点击时间 lastClickTime = curClickTime; changeTab(v.getId()); } } /** * 跳转到保值fragment * */ public void JumpToPrice() { imgCurrent.setSelected(false); mBinding.include.tvSpecail.setSelected(true); imgCurrent = mBinding.include.imgSpecail; setTextColor(2); mBinding.idViewpager.setCurrentItem(2,false); } // 接收事件(主线程) @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayStatusUpdate(PlayStatusUpdateEvent event) { String coverUrl = event.getCoverUrl(); boolean isPlaying = event.isPlaying(); ImageView ivMiniPlayerCover = mBinding.include.imgSong; // ImageView ivPlayPause = mBinding.include.ivMiniPlayerPlayPause; // 显示 mini 播放栏 mBinding.include.imgSong.setVisibility(View.VISIBLE); // 加载封面 Glide.with(this) .load(coverUrl) .transform(new CircleCrop()) .into(ivMiniPlayerCover); // 更新播放/暂停图标 // ivPlayPause.setImageResource(isPlaying ? // R.mipmap.img_gc_zt : // 暂停 // R.mipmap.img_gc_bf); // 播放 } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }package com.weishitech.qichechangtingyinyue.fragment.home; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.hfd.common.base.BaseActivity; import com.hfd.common.util.ToastUtil; import com.weishitech.qichechangtingyinyue.R; import com.weishitech.qichechangtingyinyue.bean.FavoriteManager; import com.weishitech.qichechangtingyinyue.bean.MusicBean; import com.weishitech.qichechangtingyinyue.bean.MusicCache; import com.weishitech.qichechangtingyinyue.bean.PlayHistoryManager; import com.weishitech.qichechangtingyinyue.bean.PlayStatusUpdateEvent; import com.weishitech.qichechangtingyinyue.bean.SharedMusicViewModel; import com.weishitech.qichechangtingyinyue.fragment.Adapter.RecentPlayAdapter; import com.weishitech.qichechangtingyinyue.utils.MusicPlayerManager; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; import java.util.List; public class LyricsActivity extends BaseActivity { // UI Views TextView tv_back, tv_song_name, tv_sing_name, tv_start_time, tv_end_time; ImageView iv_sing_logo, iv_tj, iv_gd, iv_xh, iv_sys, iv_bf, iv_xys, iv_zjbf; SeekBar seekbar; private boolean fromSearch = false; private boolean isSingleLoop = false; // 单曲循环开关 private FavoriteManager favoriteManager; private boolean isCurrentSongFavorite = false; // 声明 ViewModel private SharedMusicViewModel sharedViewModel; // 播放管理器 private MusicPlayerManager playerManager; private boolean isBoundToCurrentSong = false; // 是否已绑定当前歌曲 // 数据接收字段 private String title, singer, coverUrl, musicUrl; private int songPosition,totalSongCount; // 进度更新 private final Handler handler = new Handler(); private final Runnable updateProgressRunnable = new Runnable() { @Override public void run() { if (playerManager != null && playerManager.isPlaying()) { int currentPosition = playerManager.getCurrentPosition(); int duration = playerManager.getDuration(); if (duration > 0) { seekbar.setMax(duration); seekbar.setProgress(currentPosition); // 更新时间文本(格式 mm:ss) tv_start_time.setText(formatTime(currentPosition)); tv_end_time.setText(formatTime(duration)); } } handler.postDelayed(this, 1000); // 每秒更新一次 } }; private List<MusicBean.DataBean> sourceList; @Override protected int setLayout() { return R.layout.activity_lyrics; } @Override protected void setView() { tv_back = fvbi(R.id.tv_back); iv_sing_logo = fvbi(R.id.iv_sing_logo); tv_song_name = fvbi(R.id.tv_song_name); tv_sing_name = fvbi(R.id.tv_sing_name); iv_tj = fvbi(R.id.iv_tj); iv_gd = fvbi(R.id.iv_gd); seekbar = fvbi(R.id.seekbar); tv_start_time = fvbi(R.id.tv_start_time); tv_end_time = fvbi(R.id.tv_end_time); iv_xh = fvbi(R.id.iv_xh); iv_sys = fvbi(R.id.iv_sys); iv_bf = fvbi(R.id.iv_bf); iv_xys = fvbi(R.id.iv_xys); iv_zjbf = fvbi(R.id.iv_zjbf); } @Override protected void setData() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { title = bundle.getString("title"); singer = bundle.getString("singer"); coverUrl = bundle.getString("cover_url"); musicUrl = bundle.getString("music_url"); songPosition = bundle.getInt("position", -1); totalSongCount = bundle.getInt("total_count", 0); fromSearch = bundle.getBoolean("from_search", false); // 接收来源标记 // 接收来源列表(关键!) if (bundle.containsKey("source_list")) { sourceList = (List<MusicBean.DataBean>) bundle.getSerializable("source_list"); totalSongCount = sourceList.size(); // 再次确认长度 } if (songPosition < 0 || songPosition >= totalSongCount) { ToastUtil.showShortToast("歌曲位置无效"); finish(); return; } tv_song_name.setText(title); tv_sing_name.setText(singer); Glide.with(this) .load(coverUrl) .into(iv_sing_logo); } // 初始化播放器 //使用单例 playerManager = MusicPlayerManager.getInstance(); // 注册播放状态监听 setupPlaybackListener(); // 绑定当前歌曲(检查是否已在播放) bindToCurrentSong(); // 初始化收藏管理器 favoriteManager = FavoriteManager.getInstance(this); updateFavoriteState(); // 更新按钮状态 // 初始化 ViewModel sharedViewModel = new ViewModelProvider(this).get(SharedMusicViewModel.class); // 只要进入页面,就视为“播放此歌”,记录历史 if (title != null && musicUrl != null && coverUrl != null) { MusicBean.DataBean currentSong = new MusicBean.DataBean(); currentSong.setTitle(title); currentSong.setSinger(singer); currentSong.setCover(coverUrl); currentSong.setMusic(musicUrl); currentSong.setSongTime(formatTime(playerManager.getDuration())); // 可选 //记录播放历史 PlayHistoryManager.getInstance(this).addPlayRecord(currentSong); } } @Override protected void setClick() { tv_back.setOnClickListener(v -> finish()); iv_sys.setOnClickListener(v -> { if (songPosition <= 0) { ToastUtil.showShortToast("当前已是第一首"); return; } playMusicAtPosition(songPosition - 1); }); iv_xh.setOnClickListener(v -> { isSingleLoop = !isSingleLoop; if (isSingleLoop) { ToastUtil.showShortToast("已开启单曲循环"); iv_xh.setImageResource(R.mipmap.img_xh); // 假设有这个资源 } else { ToastUtil.showShortToast("已关闭单曲循环"); iv_xh.setImageResource(R.mipmap.img_xh); } }); iv_xys.setOnClickListener(v -> { if (songPosition >= totalSongCount - 1) { ToastUtil.showShortToast("当前已是最后一首"); return; } playMusicAtPosition(songPosition + 1); }); iv_tj.setOnClickListener(v -> { if (title == null || musicUrl == null) { ToastUtil.showShortToast("歌曲信息不完整"); return; } MusicBean.DataBean currentSong = new MusicBean.DataBean(); currentSong.setTitle(title); currentSong.setSinger(singer); currentSong.setCover(coverUrl); currentSong.setMusic(musicUrl); currentSong.setSongTime(formatTime(playerManager.getDuration())); // 可选 if (isCurrentSongFavorite) { // 已收藏 → 取消收藏 favoriteManager.removeFromFavorites(musicUrl); iv_tj.setImageResource(R.mipmap.img_tj); // 未收藏图标 ToastUtil.showShortToast("已取消收藏"); } else { // 未收藏 → 添加收藏 favoriteManager.addToFavorites(currentSong); iv_tj.setImageResource(R.mipmap.img_tj_u); // 已收藏图标 ToastUtil.showShortToast("已添加到我喜欢"); } isCurrentSongFavorite = !isCurrentSongFavorite; //通知所有页面,收藏列表已改变 List<MusicBean.DataBean> newList = favoriteManager.getFavoriteList(); sharedViewModel.notifyFavoriteChanged(newList); }); iv_zjbf.setOnClickListener(v -> showRecentPlayDialog()); // 播放/暂停按钮 iv_bf.setOnClickListener(v -> { if (!isBoundToCurrentSong) { ToastUtil.showShortToast("暂无歌曲信息"); return; } if (playerManager.isPlaying()) { playerManager.pause(); } else { playerManager.resume(); } updatePlayButtonIcon(); }); // SeekBar 拖动控制 seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { tv_start_time.setText(formatTime(progress)); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 用户开始拖动 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 用户停止拖动,跳转到指定位置 if (playerManager != null && isBoundToCurrentSong) { playerManager.seekTo(seekbar.getProgress()); } } }); } private void bindToCurrentSong() { if (musicUrl == null || title == null) return; boolean isPlaying = playerManager.isPlaying(); int currentPos = playerManager.getCurrentPlayingPosition(); // 判断是否就是当前正在播放的歌曲 if (isPlaying && currentPos == songPosition) { // 是同一首歌 → 直接同步状态 isBoundToCurrentSong = true; updatePlayButtonIcon(); // 显示“暂停” startUpdatingProgress(); // 开始更新进度条 } else { // 不是当前播放的 → 准备播放这首 playerManager.play(this, songPosition, musicUrl); isBoundToCurrentSong = true; updatePlayButtonIcon(); // 默认播放中 startUpdatingProgress(); } } private void setupPlaybackListener() { playerManager.setOnPlaybackStateChangedListener(new MusicPlayerManager.OnPlaybackStateChangedListener() { @Override public void onPlaying(int position) { if (position == songPosition) { runOnUiThread(() -> { updatePlayButtonIcon(); startUpdatingProgress(); }); } else { // 播放的是其他位置的歌曲 → 当前页面应暂停状态 runOnUiThread(() -> { stopUpdatingProgress(); iv_bf.setImageResource(R.mipmap.img_gc_bf); // 显示播放图标 }); } } @Override public void onPaused() { runOnUiThread(() -> { updatePlayButtonIcon(); stopUpdatingProgress(); }); } @Override public void onCompletion() { runOnUiThread(() -> { // 停止当前进度更新 stopUpdatingProgress(); seekbar.setProgress(0); tv_start_time.setText("00:00"); if (isSingleLoop) { // 重新播放当前歌曲 playerManager.play(LyricsActivity.this, songPosition, musicUrl); startUpdatingProgress(); updatePlayButtonIcon(); } else { // 自动播放下一首 int nextPosition = songPosition + 1; if (nextPosition < totalSongCount) { playMusicAtPosition(nextPosition); } else { // 已到最后 → 可选:循环播放第一首 or 提示 ToastUtil.showShortToast("已播放完毕"); updatePlayButtonIcon(); // 显示为暂停状态 // 如果你想循环回第一首,取消下面注释 playMusicAtPosition(0); } } }); } @Override public void onError(String errorMsg) { runOnUiThread(() -> { // ToastUtil.showShortToast("播放出错:" + errorMsg); updatePlayButtonIcon(); stopUpdatingProgress(); }); } }); } private void updatePlayButtonIcon() { if (playerManager.isPlaying()) { iv_bf.setImageResource(R.mipmap.img_gc_zt); // 暂停图标 } else { iv_bf.setImageResource(R.mipmap.img_gc_bf); // 播放图标 } } private void startUpdatingProgress() { stopUpdatingProgress(); // 防止重复 handler.postDelayed(updateProgressRunnable, 0); } private void stopUpdatingProgress() { handler.removeCallbacks(updateProgressRunnable); } @Override public void onResume() { super.onResume(); // 页面可见时尝试恢复状态 if (isBoundToCurrentSong) { updatePlayButtonIcon(); } } @Override protected void onPause() { super.onPause(); // 可选:不移除监听,让后台也能播放 } @Override protected void onDestroy() { stopUpdatingProgress(); // 注意:不要 release() playerManager,否则其他页面会中断 // playerManager.release(); ❌ 不要在这里释放 super.onDestroy(); } // 时间格式化工具 private String formatTime(int milliseconds) { int seconds = milliseconds / 1000; int minutes = seconds / 60; seconds = seconds % 60; return String.format("%02d:%02d", minutes, seconds); } private void playMusicAtPosition(int pos) { // 使用 MusicCache 判断边界(替代 musicDataList) if (pos < 0 || pos >= totalSongCount) { return; // 越界防护 } MusicBean.DataBean song; if (sourceList != null && pos < sourceList.size()) { song = sourceList.get(pos); } else { // 回退到主列表(兼容主列表播放) song = MusicCache.getMusicAt(pos); } // 播放指定位置的音乐 playerManager.play(this, pos, song.getMusic()); // 更新界面 updateUIForNewSong(song, pos); } /** * 播放新歌时更新界面和内部状态 */ private void updateUIForNewSong(MusicBean.DataBean song, int position) { // 更新成员变量 this.title = song.getTitle(); this.singer = song.getSinger(); this.coverUrl = song.getCover(); this.musicUrl = song.getMusic(); this.songPosition = position; // 更新 UI 显示 tv_song_name.setText(title); tv_sing_name.setText(singer); if (isDestroyed() || isFinishing()) return; Glide.with(this) .load(coverUrl) .into(iv_sing_logo); // 标记已绑定当前歌曲 isBoundToCurrentSong = true; // 更新播放按钮为“正在播放” updatePlayButtonIcon(); // 开始进度条更新 startUpdatingProgress(); // 发送 EventBus 事件 boolean currentlyPlaying = playerManager.isPlaying(); PlayStatusUpdateEvent event = new PlayStatusUpdateEvent( song.getCover(), song.getTitle(), song.getSinger(), currentlyPlaying ); EventBus.getDefault().post(event); // 发送事件 // Toast 提示 // ToastUtil.showShortToast("播放: " + title); updateFavoriteState(); PlayHistoryManager.getInstance(this).addPlayRecord(song); } private void updateFavoriteState() { if (musicUrl == null) { iv_tj.setImageResource(R.mipmap.img_tj); isCurrentSongFavorite = false; return; } isCurrentSongFavorite = favoriteManager.isFavorite(musicUrl); iv_tj.setImageResource(isCurrentSongFavorite ? R.mipmap.img_tj_u : R.mipmap.img_tj); } private void showRecentPlayDialog() { // 创建 BottomSheetDialog BottomSheetDialog dialog = new BottomSheetDialog(this); // 绑定布局 View contentView = getLayoutInflater().inflate(R.layout.dialog_recent_play, null); dialog.setContentView(contentView); // 找控件 TextView tvTitle = contentView.findViewById(R.id.tv_title); RecyclerView rvRecent = contentView.findViewById(R.id.rv_recent); // 加载数据 PlayHistoryManager historyManager = PlayHistoryManager.getInstance(this); List<MusicBean.DataBean> historyList = historyManager.getHistoryList(); tvTitle.setText("最近播放 (" + historyList.size() + ")"); // 设置适配器 RecentPlayAdapter adapter = new RecentPlayAdapter(); rvRecent.setLayoutManager(new LinearLayoutManager(this)); rvRecent.setAdapter(adapter); adapter.setData(historyList); if (musicUrl != null) { adapter.setCurrentPlayingSong(musicUrl); // 传入当前播放的 musicUrl } // 设置点击事件 adapter.setOnItemClickListener((song, position) -> { // 跳转到该歌曲的歌词页 playMusicAtPositionFromHistory(song); dialog.dismiss(); // 关闭弹窗 }); // 显示 dialog.show(); } private void playMusicAtPositionFromHistory(MusicBean.DataBean song) { // 查找当前 sourceList 中是否有这首歌 int pos = -1; if (sourceList != null) { for (int i = 0; i < sourceList.size(); i++) { if (sourceList.get(i).getMusic().equals(song.getMusic())) { pos = i; break; } } } // 如果没找到,默认为 0 或添加进临时播放? if (pos == -1) { // 可选择重新构造列表,或将它作为单曲播放 pos = 0; List<MusicBean.DataBean> temp = new ArrayList<>(); temp.add(song); sourceList = temp; totalSongCount = 1; } updateUIForNewSong(song, pos); playerManager.play(this, pos, song.getMusic()); // ToastUtil.showShortToast("正在播放:" + song.getTitle()); } } package com.weishitech.qichechangtingyinyue.bean; import java.util.ArrayList; import java.util.List; public class MusicCache { public static List<MusicBean.DataBean> getMainMusicList() { return mainMusicList; } private static List<MusicBean.DataBean> mainMusicList; public static void setMainMusicList(List<MusicBean.DataBean> list) { mainMusicList = new ArrayList<>(list); } public static MusicBean.DataBean getMusicAt(int position) { if (mainMusicList == null || position < 0 || position >= mainMusicList.size()) { return null; } return mainMusicList.get(position); } } MusicCache添加.getCurrentPlayingSong();
最新发布
12-06
package com.weishitech.qichechangtingyinyue.fragment.home; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.hfd.common.base.BaseActivity; import com.hfd.common.util.ToastUtil; import com.weishitech.qichechangtingyinyue.R; import com.weishitech.qichechangtingyinyue.bean.FavoriteManager; import com.weishitech.qichechangtingyinyue.bean.MusicBean; import com.weishitech.qichechangtingyinyue.bean.MusicCache; import com.weishitech.qichechangtingyinyue.bean.PlayHistoryManager; import com.weishitech.qichechangtingyinyue.bean.SharedMusicViewModel; import com.weishitech.qichechangtingyinyue.fragment.Adapter.RecentPlayAdapter; import com.weishitech.qichechangtingyinyue.utils.MusicPlayerManager; import java.util.ArrayList; import java.util.List; public class LyricsActivity extends BaseActivity { // UI Views TextView tv_back, tv_song_name, tv_sing_name, tv_start_time, tv_end_time; ImageView iv_sing_logo, iv_tj, iv_gd, iv_xh, iv_sys, iv_bf, iv_xys, iv_zjbf; SeekBar seekbar; private boolean fromSearch = false; private boolean isSingleLoop = false; // 单曲循环开关 private FavoriteManager favoriteManager; private boolean isCurrentSongFavorite = false; // 声明 ViewModel private SharedMusicViewModel sharedViewModel; // 播放管理器 private MusicPlayerManager playerManager; private boolean isBoundToCurrentSong = false; // 是否已绑定当前歌曲 // 数据接收字段 private String title, singer, coverUrl, musicUrl; private int songPosition,totalSongCount; // 进度更新 private final Handler handler = new Handler(); private final Runnable updateProgressRunnable = new Runnable() { @Override public void run() { if (playerManager != null && playerManager.isPlaying()) { int currentPosition = playerManager.getCurrentPosition(); int duration = playerManager.getDuration(); if (duration > 0) { seekbar.setMax(duration); seekbar.setProgress(currentPosition); // 更新时间文本(格式 mm:ss) tv_start_time.setText(formatTime(currentPosition)); tv_end_time.setText(formatTime(duration)); } } handler.postDelayed(this, 1000); // 每秒更新一次 } }; private List<MusicBean.DataBean> sourceList; @Override protected int setLayout() { return R.layout.activity_lyrics; } @Override protected void setView() { tv_back = fvbi(R.id.tv_back); iv_sing_logo = fvbi(R.id.iv_sing_logo); tv_song_name = fvbi(R.id.tv_song_name); tv_sing_name = fvbi(R.id.tv_sing_name); iv_tj = fvbi(R.id.iv_tj); iv_gd = fvbi(R.id.iv_gd); seekbar = fvbi(R.id.seekbar); tv_start_time = fvbi(R.id.tv_start_time); tv_end_time = fvbi(R.id.tv_end_time); iv_xh = fvbi(R.id.iv_xh); iv_sys = fvbi(R.id.iv_sys); iv_bf = fvbi(R.id.iv_bf); iv_xys = fvbi(R.id.iv_xys); iv_zjbf = fvbi(R.id.iv_zjbf); } @Override protected void setData() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { title = bundle.getString("title"); singer = bundle.getString("singer"); coverUrl = bundle.getString("cover_url"); musicUrl = bundle.getString("music_url"); songPosition = bundle.getInt("position", -1); totalSongCount = bundle.getInt("total_count", 0); fromSearch = bundle.getBoolean("from_search", false); // 接收来源标记 // 接收来源列表(关键!) if (bundle.containsKey("source_list")) { sourceList = (List<MusicBean.DataBean>) bundle.getSerializable("source_list"); totalSongCount = sourceList.size(); // 再次确认长度 } if (songPosition < 0 || songPosition >= totalSongCount) { ToastUtil.showShortToast("歌曲位置无效"); finish(); return; } tv_song_name.setText(title); tv_sing_name.setText(singer); Glide.with(this) .load(coverUrl) .into(iv_sing_logo); } // 初始化播放器 //使用单例 playerManager = MusicPlayerManager.getInstance(); // 注册播放状态监听 setupPlaybackListener(); // 绑定当前歌曲(检查是否已在播放) bindToCurrentSong(); // 初始化收藏管理器 favoriteManager = FavoriteManager.getInstance(this); updateFavoriteState(); // 更新按钮状态 // 初始化 ViewModel sharedViewModel = new ViewModelProvider(this).get(SharedMusicViewModel.class); // 只要进入页面,就视为“播放此歌”,记录历史 if (title != null && musicUrl != null && coverUrl != null) { MusicBean.DataBean currentSong = new MusicBean.DataBean(); currentSong.setTitle(title); currentSong.setSinger(singer); currentSong.setCover(coverUrl); currentSong.setMusic(musicUrl); currentSong.setSongTime(formatTime(playerManager.getDuration())); // 可选 //记录播放历史 PlayHistoryManager.getInstance(this).addPlayRecord(currentSong); } } @Override protected void setClick() { tv_back.setOnClickListener(v -> finish()); iv_sys.setOnClickListener(v -> { if (songPosition <= 0) { ToastUtil.showShortToast("当前已是第一首"); return; } playMusicAtPosition(songPosition - 1); }); iv_xh.setOnClickListener(v -> { isSingleLoop = !isSingleLoop; if (isSingleLoop) { ToastUtil.showShortToast("已开启单曲循环"); iv_xh.setImageResource(R.mipmap.img_xh); // 假设有这个资源 } else { ToastUtil.showShortToast("已关闭单曲循环"); iv_xh.setImageResource(R.mipmap.img_xh); } }); iv_xys.setOnClickListener(v -> { if (songPosition >= totalSongCount - 1) { ToastUtil.showShortToast("当前已是最后一首"); return; } playMusicAtPosition(songPosition + 1); }); iv_tj.setOnClickListener(v -> { if (title == null || musicUrl == null) { ToastUtil.showShortToast("歌曲信息不完整"); return; } MusicBean.DataBean currentSong = new MusicBean.DataBean(); currentSong.setTitle(title); currentSong.setSinger(singer); currentSong.setCover(coverUrl); currentSong.setMusic(musicUrl); currentSong.setSongTime(formatTime(playerManager.getDuration())); // 可选 if (isCurrentSongFavorite) { // 已收藏 → 取消收藏 favoriteManager.removeFromFavorites(musicUrl); iv_tj.setImageResource(R.mipmap.img_tj); // 未收藏图标 ToastUtil.showShortToast("已取消收藏"); } else { // 未收藏 → 添加收藏 favoriteManager.addToFavorites(currentSong); iv_tj.setImageResource(R.mipmap.img_tj_u); // 已收藏图标 ToastUtil.showShortToast("已添加到我喜欢"); } isCurrentSongFavorite = !isCurrentSongFavorite; //通知所有页面,收藏列表已改变 List<MusicBean.DataBean> newList = favoriteManager.getFavoriteList(); sharedViewModel.notifyFavoriteChanged(newList); }); iv_zjbf.setOnClickListener(v -> showRecentPlayDialog()); // 播放/暂停按钮 iv_bf.setOnClickListener(v -> { if (!isBoundToCurrentSong) { ToastUtil.showShortToast("暂无歌曲信息"); return; } if (playerManager.isPlaying()) { playerManager.pause(); } else { playerManager.resume(); } updatePlayButtonIcon(); }); // SeekBar 拖动控制 seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { tv_start_time.setText(formatTime(progress)); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 用户开始拖动 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 用户停止拖动,跳转到指定位置 if (playerManager != null && isBoundToCurrentSong) { playerManager.seekTo(seekbar.getProgress()); } } }); } private void bindToCurrentSong() { if (musicUrl == null || title == null) return; boolean isPlaying = playerManager.isPlaying(); int currentPos = playerManager.getCurrentPlayingPosition(); // 判断是否就是当前正在播放的歌曲 if (isPlaying && currentPos == songPosition) { // 是同一首歌 → 直接同步状态 isBoundToCurrentSong = true; updatePlayButtonIcon(); // 显示“暂停” startUpdatingProgress(); // 开始更新进度条 } else { // 不是当前播放的 → 准备播放这首 playerManager.play(this, songPosition, musicUrl); isBoundToCurrentSong = true; updatePlayButtonIcon(); // 默认播放中 startUpdatingProgress(); } } private void setupPlaybackListener() { playerManager.setOnPlaybackStateChangedListener(new MusicPlayerManager.OnPlaybackStateChangedListener() { @Override public void onPlaying(int position) { if (position == songPosition) { runOnUiThread(() -> { updatePlayButtonIcon(); startUpdatingProgress(); }); } else { // 播放的是其他位置的歌曲 → 当前页面应暂停状态 runOnUiThread(() -> { stopUpdatingProgress(); iv_bf.setImageResource(R.mipmap.img_gc_bf); // 显示播放图标 }); } } @Override public void onPaused() { runOnUiThread(() -> { updatePlayButtonIcon(); stopUpdatingProgress(); }); } @Override public void onCompletion() { runOnUiThread(() -> { // 停止当前进度更新 stopUpdatingProgress(); seekbar.setProgress(0); tv_start_time.setText("00:00"); if (isSingleLoop) { // 重新播放当前歌曲 playerManager.play(LyricsActivity.this, songPosition, musicUrl); startUpdatingProgress(); updatePlayButtonIcon(); } else { // 自动播放下一首 int nextPosition = songPosition + 1; if (nextPosition < totalSongCount) { playMusicAtPosition(nextPosition); } else { // 已到最后 → 可选:循环播放第一首 or 提示 ToastUtil.showShortToast("已播放完毕"); updatePlayButtonIcon(); // 显示为暂停状态 // 如果你想循环回第一首,取消下面注释 playMusicAtPosition(0); } } }); } @Override public void onError(String errorMsg) { runOnUiThread(() -> { // ToastUtil.showShortToast("播放出错:" + errorMsg); updatePlayButtonIcon(); stopUpdatingProgress(); }); } }); } private void updatePlayButtonIcon() { if (playerManager.isPlaying()) { iv_bf.setImageResource(R.mipmap.img_gc_zt); // 暂停图标 } else { iv_bf.setImageResource(R.mipmap.img_gc_bf); // 播放图标 } } private void startUpdatingProgress() { stopUpdatingProgress(); // 防止重复 handler.postDelayed(updateProgressRunnable, 0); } private void stopUpdatingProgress() { handler.removeCallbacks(updateProgressRunnable); } @Override public void onResume() { super.onResume(); // 页面可见时尝试恢复状态 if (isBoundToCurrentSong) { updatePlayButtonIcon(); } } @Override protected void onPause() { super.onPause(); // 可选:不移除监听,让后台也能播放 } @Override protected void onDestroy() { stopUpdatingProgress(); // 注意:不要 release() playerManager,否则其他页面会中断 // playerManager.release(); ❌ 不要在这里释放 super.onDestroy(); } // 时间格式化工具 private String formatTime(int milliseconds) { int seconds = milliseconds / 1000; int minutes = seconds / 60; seconds = seconds % 60; return String.format("%02d:%02d", minutes, seconds); } private void playMusicAtPosition(int pos) { // 使用 MusicCache 判断边界(替代 musicDataList) if (pos < 0 || pos >= totalSongCount) { return; // 越界防护 } MusicBean.DataBean song; if (sourceList != null && pos < sourceList.size()) { song = sourceList.get(pos); } else { // 回退到主列表(兼容主列表播放) song = MusicCache.getMusicAt(pos); } // 播放指定位置的音乐 playerManager.play(this, pos, song.getMusic()); // 更新界面 updateUIForNewSong(song, pos); } /** * 播放新歌时更新界面和内部状态 */ private void updateUIForNewSong(MusicBean.DataBean song, int position) { // 更新成员变量 this.title = song.getTitle(); this.singer = song.getSinger(); this.coverUrl = song.getCover(); this.musicUrl = song.getMusic(); this.songPosition = position; // 更新 UI 显示 tv_song_name.setText(title); tv_sing_name.setText(singer); if (isDestroyed() || isFinishing()) return; Glide.with(this) .load(coverUrl) .into(iv_sing_logo); // 标记已绑定当前歌曲 isBoundToCurrentSong = true; // 更新播放按钮为“正在播放” updatePlayButtonIcon(); // 开始进度条更新 startUpdatingProgress(); // Toast 提示 // ToastUtil.showShortToast("播放: " + title); updateFavoriteState(); PlayHistoryManager.getInstance(this).addPlayRecord(song); } private void updateFavoriteState() { if (musicUrl == null) { iv_tj.setImageResource(R.mipmap.img_tj); isCurrentSongFavorite = false; return; } isCurrentSongFavorite = favoriteManager.isFavorite(musicUrl); iv_tj.setImageResource(isCurrentSongFavorite ? R.mipmap.img_tj_u : R.mipmap.img_tj); } private void showRecentPlayDialog() { // 创建 BottomSheetDialog BottomSheetDialog dialog = new BottomSheetDialog(this); // 绑定布局 View contentView = getLayoutInflater().inflate(R.layout.dialog_recent_play, null); dialog.setContentView(contentView); // 找控件 TextView tvTitle = contentView.findViewById(R.id.tv_title); RecyclerView rvRecent = contentView.findViewById(R.id.rv_recent); // 加载数据 PlayHistoryManager historyManager = PlayHistoryManager.getInstance(this); List<MusicBean.DataBean> historyList = historyManager.getHistoryList(); tvTitle.setText("最近播放 (" + historyList.size() + ")"); // 设置适配器 RecentPlayAdapter adapter = new RecentPlayAdapter(); rvRecent.setLayoutManager(new LinearLayoutManager(this)); rvRecent.setAdapter(adapter); adapter.setData(historyList); if (musicUrl != null) { adapter.setCurrentPlayingSong(musicUrl); // 传入当前播放的 musicUrl } // 设置点击事件 adapter.setOnItemClickListener((song, position) -> { // 跳转到该歌曲的歌词页 playMusicAtPositionFromHistory(song); dialog.dismiss(); // 关闭弹窗 }); // 显示 dialog.show(); } private void playMusicAtPositionFromHistory(MusicBean.DataBean song) { // 查找当前 sourceList 中是否有这首歌 int pos = -1; if (sourceList != null) { for (int i = 0; i < sourceList.size(); i++) { if (sourceList.get(i).getMusic().equals(song.getMusic())) { pos = i; break; } } } // 如果没找到,默认为 0 或添加进临时播放? if (pos == -1) { // 可选择重新构造列表,或将它作为单曲播放 pos = 0; List<MusicBean.DataBean> temp = new ArrayList<>(); temp.add(song); sourceList = temp; totalSongCount = 1; } updateUIForNewSong(song, pos); playerManager.play(this, pos, song.getMusic()); // ToastUtil.showShortToast("正在播放:" + song.getTitle()); } } package com.weishitech.qichechangtingyinyue; import android.annotation.SuppressLint; import android.view.View; import android.widget.ImageView; import androidx.fragment.app.Fragment; import com.umeng.commonsdk.UMConfigure; import com.weishitech.qichechangtingyinyue.adtakubase.activity.BaseBindActivity; import com.weishitech.qichechangtingyinyue.adtakubase.inter.insert.IAdInsertView; import com.weishitech.qichechangtingyinyue.adtakubase.inter.nativ.IAdNativeView; import com.weishitech.qichechangtingyinyue.databinding.ActivityMainBinding; import com.weishitech.qichechangtingyinyue.fragment.Adapter.NavigationFragmentAdapter; import com.weishitech.qichechangtingyinyue.fragment.specail.SpecialFragment; import com.weishitech.qichechangtingyinyue.fragment.home.HomeFragment; import com.weishitech.qichechangtingyinyue.fragment.lilv.LiLvFragment; import com.weishitech.qichechangtingyinyue.fragment.tools.ToolsFragment; import com.weishitech.qichechangtingyinyue.fragment.wode.WoDeFragment; import java.util.ArrayList; import java.util.List; public class MainActivity extends BaseBindActivity<ActivityMainBinding> implements View.OnClickListener,IAdInsertView, IAdNativeView { private ImageView imgCurrent; //其中定义了四个Fragment,放入ArrayList中 ArrayList<Fragment> fragments = new ArrayList<>(); //五个fragments添加,暂时使用TempFragment页面做页面简单展示 HomeFragment homeFragment; LiLvFragment liLvFragment; SpecialFragment specialFragment; //WeatherFragment weatherFragment; ToolsFragment toolsFragment; WoDeFragment woDeFragment; //int index = 0;//标记当前页码 private List<AppAdEnum> mAdEnumList; @Override protected void init() { // SDK预初始化函数不会采集设备信息,也不会向友盟后台上报数据。 // preInit预初始化函数耗时极少,不会影响App首次冷启动用户体验 UMConfigure.preInit(getApplication(), LCAppcation.umengKey, LCAppcation.channelName); //初始化组件化基础库, 所有友盟业务SDK都必须调用此初始化接口。 //建议在宿主App的Application.onCreate函数中调用基础组件库初始化函数。 UMConfigure.init(getApplication(), LCAppcation.umengKey, LCAppcation.channelName, UMConfigure.DEVICE_TYPE_PHONE, ""); /** *设置组件化的Log开关 *参数: boolean 默认为false,如需查看LOG设置为true */ UMConfigure.setLogEnabled(BuildConfig.DEBUG); mBinding.include.tabNavigationBottomRili.setOnClickListener(this); mBinding.include.tabNavigationBottomLilv.setOnClickListener(this); mBinding.include.tabNavigationBottomSpecail.setOnClickListener(this); mBinding.include.tabNavigationBottomPssb.setOnClickListener(this); mBinding.include.tabNavigationBottomWode.setOnClickListener(this); //默认选中日历 mBinding.include.imgRili.setSelected(true); mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.tab_select)); imgCurrent = mBinding.include.imgRili; //设置不可滑动 mBinding.idViewpager.setUserInputEnabled(false); homeFragment = new HomeFragment(); liLvFragment = new LiLvFragment(); specialFragment = new SpecialFragment(); // toolsFragment = new ToolsFragment(); woDeFragment = new WoDeFragment(); fragments.add(homeFragment); fragments.add(liLvFragment); fragments.add(specialFragment); // fragments.add(toolsFragment); fragments.add(woDeFragment); //装配NavigationFrameworkAdapter适配器 NavigationFragmentAdapter pagerAdapter = new NavigationFragmentAdapter(getSupportFragmentManager(), getLifecycle(), fragments); //绑定适配器 mBinding.idViewpager.setAdapter(pagerAdapter); if (mAdEnumList == null) { mAdEnumList = new ArrayList<>(); } mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB1); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB2); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB3); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB4); mAdEnumList.add(AppAdEnum.AD_INTERSTITIAL_TAB5); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB1); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB2); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB3); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB4); mAdEnumList.add(AppAdEnum.AD_NATIVE_TAB5); setTextColor(0); } //页面切换方法,已经包含两种情况,滑动和点击切换 @SuppressLint("NonConstantResourceId") private void changeTab(int position) { imgCurrent.setSelected(false); //在android中使用switch case语句可能会出现报错冒红现象,请看最后的注意事项,可以解决这个问题 switch (position) { case R.id.tab_navigation_bottom_rili: //点击图片后,切换页面 mBinding.idViewpager.setCurrentItem(0,false); setTextColor(0); case 0: //滑动到第一个界面(索引为0)触发被选中效果,即切换图标(从黑→绿) //imgWeChat.setSelected(true)这部分功能请看后面的tab_navigation__bottom部分 mBinding.include.imgRili.setSelected(true); imgCurrent = mBinding.include.imgRili; break; case R.id.tab_navigation_bottom_lilv: mBinding.idViewpager.setCurrentItem(1,false); setTextColor(1); case 1: mBinding.include.imgLilv.setSelected(true); imgCurrent = mBinding.include.imgLilv; break; case R.id.tab_navigation_bottom_specail: mBinding.idViewpager.setCurrentItem(2,false); setTextColor(2); case 2: mBinding.include.imgSpecail.setSelected(true); imgCurrent = mBinding.include.imgSpecail; break; case R.id.tab_navigation_bottom_pssb: mBinding.idViewpager.setCurrentItem(3,false); setTextColor(3); case 3: mBinding.include.imgPssb.setSelected(true); imgCurrent = mBinding.include.imgPssb; break; case R.id.tab_navigation_bottom_wode: mBinding.idViewpager.setCurrentItem(4,false); setTextColor(4); case 4: mBinding.include.imgWode.setSelected(true); imgCurrent = mBinding.include.imgWode; break; } } private void setTextColor(int index){ initInsert(mAdEnumList.get(index)); initNative(mAdEnumList.get(index+fragments.size())); mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvLilv.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvSpecail.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvPssb.setTextColor(getResources().getColor(R.color.text_tab)); mBinding.include.tvWode.setTextColor(getResources().getColor(R.color.text_tab)); switch (index){ case 0: mBinding.include.tvRili.setTextColor(getResources().getColor(R.color.tab_select)); break; case 1: mBinding.include.tvLilv.setTextColor(getResources().getColor(R.color.tab_select)); break; case 2: mBinding.include.tvSpecail.setTextColor(getResources().getColor(R.color.tab_select)); break; case 3: mBinding.include.tvPssb.setTextColor(getResources().getColor(R.color.tab_select)); break; case 4: mBinding.include.tvWode.setTextColor(getResources().getColor(R.color.tab_select)); break; } } // 两次点击按钮之间的点击间隔不能少于1000毫秒 private static final long MIN_CLICK_DELAY_TIME = 500; private static long lastClickTime; //点击导航栏时,将图片的ID传入changeTab,触发切换页面事件 @Override public void onClick(View v) { long curClickTime = System.currentTimeMillis(); if((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) { // 超过点击间隔后再将lastClickTime重置为当前点击时间 lastClickTime = curClickTime; changeTab(v.getId()); } } /** * 跳转到保值fragment * */ public void JumpToPrice() { imgCurrent.setSelected(false); mBinding.include.tvSpecail.setSelected(true); imgCurrent = mBinding.include.imgSpecail; setTextColor(2); mBinding.idViewpager.setCurrentItem(2,false); } }我想把LyricsActivity正在播放歌曲的封面图传到MainActivity怎么修改
12-06
package com.example.sangelywospecial.ui.flow; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.provider.MediaStore; import android.text.InputType; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import android.os.Bundle; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; import com.alibaba.fastjson.JSONObject; import com.example.sangelywospecial.R; import com.example.sangelywospecial.fragment.flow.DtlFlowFragment; import com.example.sangelywospecial.fragment.flow.MainFlowFragment; import com.example.sangelywospecial.fragment.flow.SignFlowFragment; import com.example.sangelywospecial.fragment.flow.StyleImageFragment; import com.example.sangelywospecial.models.*; import com.example.sangelywospecial.ui.qrcode.CustomCaptureActivity; import com.example.sangelywospecial.util.MyDialog; import com.example.sangelywospecial.util.MyRequest; import com.github.clans.fab.FloatingActionButton; import com.xuexiang.xpage.base.XPageActivity; import com.xuexiang.xqrcode.XQRCode; import com.xuexiang.xui.adapter.FragmentAdapter; import com.xuexiang.xui.widget.dialog.LoadingDialog; import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog; import com.xuexiang.xui.widget.tabbar.TabSegment; import com.xuexiang.xui.widget.toast.XToast; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.HashMap; import java.util.Objects; import java.util.function.Consumer; import static com.xuexiang.xui.XUI.getContext; /** * 2022-1-20 * 样品开发单 */ public class FlowActivity extends XPageActivity implements View.OnClickListener { private static final int REQUEST_VIDEO_CAPTURE = 200; private final int scanCode = 0; private LoadingDialog loadingDialog; private MyRequest myRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_inclued_flow); // 初始化前清除可能存在的错误事件 EventBus.getDefault().removeAllStickyEvents(); initTab(); initMenu(); initToolbar(); EventBus.getDefault().register(this); loadingDialog = new LoadingDialog(this) .setIconScale(0.4F) .setLoadingSpeed(8); loadingDialog.setCancelable(true); myRequest = new MyRequest(this); SharedPreferences flow = getSharedPreferences("flow", MODE_PRIVATE); String barcode = flow.getString("barcode",""); if (!Objects.equals(barcode,"")){ String url = "/api/flow/find?barcode="+barcode; myRequest.doRequest(loadingDialog,url,this,jsonObject -> { try { if (jsonObject == null || !jsonObject.containsKey("data")) { throw new Exception("本地缓存已失效"); } JSONObject data = jsonObject.getJSONObject("data"); SampleStyleData sampleStyleData = new SampleStyleData(data); if (sampleStyleData.getSampleStyle() == null){ EventBus.getDefault().post(MyDialog.createMessageDialog(this,"二维码{"+barcode+"}对应的样品单为空")); return; } EventBus.getDefault().post(sampleStyleData); } catch (Exception e) { flow.edit().remove("barcode").apply(); XToast.error(this, e.getMessage(), Toast.LENGTH_LONG).show(); } },500); } } @Override protected void onResume() { super.onResume(); } @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); } private void initMenu() { FloatingActionButton scanQrcode = findViewById(R.id.scan_qrcode); scanQrcode.setOnClickListener(this); FloatingActionButton refresh = findViewById(R.id.refresh); refresh.setOnClickListener(this); } private void initToolbar(){ Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(v->onBackPressed()); toolbar.inflateMenu(R.menu.menu_flow); toolbar.setOnMenuItemClickListener(item -> { if ("回报错误".equals(item.toString())) { FragmentAdapter<Fragment> adapter = (FragmentAdapter<Fragment>) viewPager.getAdapter(); assert adapter != null; MainFlowFragment item1 = (MainFlowFragment) adapter.getItem(0); BglSampleStyle sampleStyle = item1.getSampleStyle(); MaterialDialog builder = new MaterialDialog.Builder(this) .customView(R.layout.dialog_flow_error, true) .title("样品单{" + sampleStyle.getStyleNo() + "}") .positiveText(R.string.confirm) .negativeText(R.string.cancel) .onPositive((dialog, which) -> { EditText viewById = dialog.findViewById(R.id.message); String s = viewById.getText().toString(); HashMap<String, String> param = new HashMap<>(); param.put("error", s); param.put("id", sampleStyle.getId().toString()); myRequest.doPost(loadingDialog, "/api/flow/ReportError", this, jsonObject -> { }, param); }).build(); EditText viewById = builder.findViewById(R.id.message); viewById.setText(sampleStyle.getError()); builder.show(); return true; }else if(item.getItemId() == R.id.log){ Intent intent = new Intent(this, ItemLogActivity.class); startActivity(intent); return true; }else if (item.getItemId() == R.id.video){ Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if (takeVideoIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); } } return false; }); } private ViewPager viewPager; private void initTab() { viewPager = findViewById(R.id.view_pager); FragmentAdapter<Fragment> adapter = new FragmentAdapter<>(getSupportFragmentManager()); TabSegment tabSegment = findViewById(R.id.tabSegment); tabSegment.addTab(new TabSegment.Tab("主档信息")); adapter.addFragment(MainFlowFragment.newInstance(), "主档信息"); tabSegment.addTab(new TabSegment.Tab("图片信息")); adapter.addFragment(new StyleImageFragment(), "图片信息"); tabSegment.addTab(new TabSegment.Tab("核对信息")); adapter.addFragment(new SignFlowFragment(), "核对信息"); tabSegment.addTab(new TabSegment.Tab("样品单明细")); adapter.addFragment(new DtlFlowFragment(), "样品单明细"); viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(2); viewPager.setCurrentItem(0); tabSegment.setupWithViewPager(viewPager); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.scan_qrcode: CustomCaptureActivity.start(this, scanCode, R.style.XQRCodeTheme_Custom); break; case R.id.refresh: System.out.println(345); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == scanCode) { handleResult(data); }else if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) { Intent intent = new Intent(this, VideoViewActivity.class); assert data != null; Uri videoUri = data.getData(); intent.setData(videoUri); startActivity(intent); } } private void handleResult(Intent data) { try { // 1. 清除可能存在的错误缓存 SharedPreferences flow = getSharedPreferences("flow", MODE_PRIVATE); // 2. 基础检查 if (data == null || data.getExtras() == null) { flow.edit().remove("barcode").apply(); // 清除错误数据 XToast.error(this, "扫描结果无效", Toast.LENGTH_LONG).show(); return; } Bundle bundle = data.getExtras(); int resultType = bundle.getInt(XQRCode.RESULT_TYPE, XQRCode.RESULT_FAILED); if (resultType != XQRCode.RESULT_SUCCESS) { flow.edit().remove("barcode").apply(); XToast.info(this, "解析二维码失败", Toast.LENGTH_LONG).show(); return; } String result = bundle.getString(XQRCode.RESULT_DATA); if (result == null || result.isEmpty()) { flow.edit().remove("barcode").apply(); XToast.error(this, "扫描结果为空", Toast.LENGTH_LONG).show(); return; } // 3. 保存有效的扫描结果 flow.edit().putString("barcode", result).apply(); // 4. 发起网络请求 String url = "/api/flow/find?barcode=" + result; myRequest.doRequest(loadingDialog, url, this, jsonObject -> { try { // 5. 严格检查数据有效性 if (jsonObject == null || !jsonObject.containsKey("data")) { throw new Exception("服务器返回数据格式错误"); } JSONObject datas = jsonObject.getJSONObject("data"); if (datas == null || datas.isEmpty()) { flow.edit().remove("barcode").apply(); // 清除无效数据 throw new Exception("样品单数据为空"); } SampleStyleData sampleStyleData = new SampleStyleData(datas); if (sampleStyleData.getSampleStyle() == null) { flow.edit().remove("barcode").apply(); // 清除无效数据 throw new Exception("数据解析失败"); } // 6. 发送有效数据 EventBus.getDefault().post(sampleStyleData); } catch (Exception e) { flow.edit().remove("barcode").apply(); // 清除错误数据 XToast.error(FlowActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } }); } catch (Exception e) { getSharedPreferences("flow", MODE_PRIVATE).edit().remove("barcode").apply(); XToast.error(this, "处理异常: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(BglSampleStyleSign sign){ HashMap<String,String> param = new HashMap<>(); param.put("id",sign.getId().toString()); if (sign.getClick() == 1){ if ("销售单".equals(sign.getGenData())){ new MaterialDialog.Builder(this) .title(sign.getOperateType()) .content("销售数量:") .inputType(InputType.TYPE_CLASS_NUMBER) .input("请填写销售数量", "", false, (dialog,input)->{}) .inputRange(1, 6) .positiveText("确定") .negativeText("取消") .onPositive(((dialog, which) ->{ param.put("qty_sale",dialog.getInputEditText().getText().toString()); Consumer<JSONObject> consumer = this::UpdateSign; myRequest.doPost(loadingDialog, "/api/flow/update/sign", this, consumer, param); })) .cancelable(true) .show(); }else { Consumer<JSONObject> consumer = this::UpdateSign; myRequest.doPost(loadingDialog, "/api/flow/update/sign", this, consumer, param); } }else if (sign.getClick() == -1){ Consumer<JSONObject> consumer = this::UpdateSign; myRequest.doPost(loadingDialog,"/api/flow/cancel/sign",this,consumer,param); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MyToastEvent event){ if (event.getResponseCode() == ResponseCode.SuccessCode){ XToast.success(this,event.getMessage()).show(); }else if(event.getResponseCode()==400){ XToast.info(this,event.getMessage(),XToast.LENGTH_LONG).show(); }else{ XToast.error(this,event.getMessage(),XToast.LENGTH_LONG).show(); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MaterialDialog.Builder builder){ builder.show(); } private void UpdateSign(JSONObject jsonObject){ EventBus.getDefault().post(new BglSampleStyleSign(jsonObject.getJSONObject("data"))); MyToastEvent myToastEvent = new MyToastEvent(); myToastEvent.setResponseCode(ResponseCode.SuccessCode); myToastEvent.setMessage("操作成功"); EventBus.getDefault().post(myToastEvent); } }上面代码报错Object reference not set to aninstance of an object.
08-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值