Android:如何添加一个自定义的按钮状态

例如,默认按钮在它的状态和背景图片之间具有以下依赖:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/btn_default_normal_disable" />
    <item android:state_pressed="true" 
        android:drawable="@drawable/btn_default_pressed" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/btn_default_selected" />
    <item android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_focused="true"
        android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item
        android:drawable="@drawable/btn_default_normal_disable" />
</selector>

我如何定义自己的自定义状态(如android:state_custom), 然后可以使用它动态地改变按钮的外观吗?

1个回答

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="food">
        <attr name="state_fried" format="boolean" />
        <attr name="state_baked" format="boolean" />
    </declare-styleable>
</resources>

public FoodButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

private static final int[] STATE_FRIED = {R.attr.state_fried};
private static final int[] STATE_BAKED = {R.attr.state_baked};

private boolean mIsFried = false;
private boolean mIsBaked = false;

public void setFried(boolean isFried) {mIsFried = isFried;}
public void setBaked(boolean isBaked) {mIsBaked = isBaked;}
Then override function "onCreateDrawableState":

@Override
protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
    if (mIsFried) {
        mergeDrawableStates(drawableState, STATE_FRIED);
    }
    if (mIsBaked) {
        mergeDrawableStates(drawableState, STATE_BAKED);
    }
    return drawableState;
}

文件 "res/drawable/food_button.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.mydomain.mypackage">
<item
    app:state_baked="true"
    app:state_fried="false"
    android:drawable="@drawable/item_baked" />
<item
    app:state_baked="false"
    app:state_fried="true"
    android:drawable="@drawable/item_fried" />
<item
    app:state_baked="true"
    app:state_fried="true"
    android:drawable="@drawable/item_overcooked" />
<item
    app:state_baked="false"
    app:state_fried="false"
    android:drawable="@drawable/item_raw" />
</selector>
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【Android】自定义RadioButton,请问如何改变选中状态的图片大小?
在点击按钮时,按钮被选中状态的图片要高出一些,请问该如何实现?
android 如何自定义 popupwindow 效果类似 58同城 的筛选功能
效果类似 58同城 的筛选功能 ![图片说明](https://img-ask.csdn.net/upload/201604/22/1461285065_777419.png) ![图片说明](https://img-ask.csdn.net/upload/201604/22/1461285075_820018.png) 我在网上找过带有类似筛选效果的源码,发现个问题。其中一个popupwindow处于打开状态时当我想点击另一个按钮打开其他的popupwindow时,会先关闭之前打开的popupwindow,然后我再次点击按钮才会打开其他的popupwindow。而58同城是直接就关闭旧的popupwindow并打开其他的popupwindow。
如何在ListView中添加CheckBox
我自定义了一个ListView布局,想在里面添加一个CheckBox按钮,我遇到了下面的第二个问题,虽然有解决方法但不知道具体怎么做,最好能给个完整的例子,谢谢大家了! 1、ListView item中加入checkbox后onListItemClick 事件无法触发。 原因:checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决方案:设置checkbox的android:focusable="false" 2、选择其中的checkbox,当滚动ListView的时候,会出现一些Checkbox选择错位的现象, 原因:为记住Checkbox的选择状态 解决方案:当选择Checkbox的时候,记下其状态,然后在getView方法中进行设置
android中Toast出文字同时整个activity变暗成半透明状态,如何实现
在activity的底部有一个收藏按钮,要实现的效果是:点击该按钮,activity变为半透明 状态,且toast出的文字在activity居中显示。我考虑到用动画效果和自定义Toast,但 还是搞出来,求帮忙
Android Fragment底部选项卡,如何能在跳转二级、三级甚至更多层页面时也保持活动状态
Android Fragment底部选项卡,如何能在跳转二级、三级甚至更多层页面时也保持活动状态,如题:项目中要用到,在Fragment多层子界面依然可以进行Fragment之间的传递,如: A Fragment > A按钮 > A界面 > A按钮 > C Fragment > C界面,当点击返回时,返回A界面(从A界面进入C界面时,如从C Fragment进入则返回C Fragmeent) Ps: 当从A界面 > C Fragment时,底部选项卡的显示也要进行相关切换...... 上述就是需求了,之前Fragment子界面是在布局中直接引用自定义View来实现底部选项卡不被覆盖的,但这样并不好,因为它没有自己的生命周期导致扩展不行,想把Fragment子界面换成有自己生命周期的,但无从下手,请大牛们指点下,感激......
HorizontalScrollView在ListView被回收利用
我有一个ListView,子view是HorizontalScrollView,当我对的ListView中的第一个子HorizontalScrollView从右边滑动到左边,把删除按钮显示出来之后,我再操作ListView上下滚动时,ListView会复用之前滑动HorizontalScrollView的view. ![图片说明](https://img-ask.csdn.net/upload/201605/08/1462722379_958525.png) ![图片说明](https://img-ask.csdn.net/upload/201605/08/1462722547_369286.png) 我的代码: ListView 子view布局: ``` <?xml version="1.0" encoding="utf-8"?> <com.example.administrator.myapplication.DeleteView android:id="@+id/GrafDelete_root" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#f1f1f1" android:scrollbars="none" > <LinearLayout android:id="@+id/ll_content" android:layout_width="920px" android:layout_height="180px" android:orientation="horizontal"> <RelativeLayout android:id="@+id/re_select" android:layout_width="80px" android:layout_height="180px" android:background="@color/colorAccent"> <ImageView android:id="@+id/select" android:layout_width="36px" android:layout_height="36px" android:layout_centerInParent="true" android:scaleType="centerCrop"/> </RelativeLayout> <AbsoluteLayout android:id="@+id/ab_view_bg" android:layout_width="720px" android:layout_height="180px"> <TextView android:id="@+id/text_title" android:layout_width="450px" android:layout_height="80px" android:layout_x="20px" android:layout_y="30px" android:gravity="center_vertical" android:maxLines="2" android:textColor="#515151" android:textSize="30px" /> </AbsoluteLayout> <AbsoluteLayout android:id="@+id/ab_delete_bg" android:layout_width="wrap_content" android:layout_height="wrap_content"> <View android:id="@+id/view_delete_bg" android:layout_width="120px" android:layout_height="180px" android:background="#ff0000" ></View> <TextView android:id="@+id/text_delete" android:layout_width="120px" android:layout_height="60px" android:layout_y="90px" android:gravity="center" android:text="删除" android:textColor="#ffffff" android:textSize="30px" /> </AbsoluteLayout> </LinearLayout> </com.example.administrator.myapplication.DeleteView> ``` 自定义的HorizontalScrollView,可以从又滑动到左边,显示被影藏的删除按钮: ``` public class DeleteView extends HorizontalScrollView { private static final int SWIPE_MIN_DISTANCE = 5; private static final int SWIPE_THRESHOLD_VELOCITY = 600; private GestureDetector gestureDetector; private Context context; private int start;//开始滑动的位置 private int end;//结束滑动的位置 private VelocityTracker velocityTracker; private int width;//屏幕宽度的额外宽度。 private boolean isEnableScroll;//是否打开水平滑动 true可以水平滑动 false不能水平滑动 public DeleteView(Context context) { super(context); } public DeleteView(Context context, AttributeSet attrs) { super(context, attrs); width = 120;//设定额外的宽度 gestureDetector = new GestureDetector(new MyGestureDetector()); } public DeleteView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain(); } if (!isEnableScroll) return true; if (gestureDetector.onTouchEvent(event)) return true; if (event.getAction() == MotionEvent.ACTION_DOWN) { start = (int) event.getRawX(); } if (event.getAction() == MotionEvent.ACTION_UP) { end = (int) event.getRawX(); if (start > end) { if (getScrollX() < width / 2 || velocityTracker.getXVelocity() > SWIPE_THRESHOLD_VELOCITY) { smoothScrollTo(0, 0); } else { smoothScrollTo(width, 0); } } if (start < end) { if (getScrollX() > width / 2 || velocityTracker.getXVelocity() > SWIPE_THRESHOLD_VELOCITY) { smoothScrollTo(width, 0); } else { smoothScrollTo(0, 0); } } velocityTracker.clear(); return true; } if (event.getAction() == MotionEvent.ACTION_MOVE) { velocityTracker.addMovement(event); } return super.onTouchEvent(event); } class MyGestureDetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (!isEnableScroll) return true; try { //right to left if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { smoothScrollTo(width, 0); return true; } } catch (Exception e) { // nothing } return false; } } //是否开启水平滑动 public void setEnAbleHorizontalScroll(boolean b) { if (b == isEnableScroll) { return; } else { isEnableScroll = b; } if (!isEnableScroll) { smoothScrollTo(0, 0); } } } ``` Adapter: ``` public class ListAdapter extends BaseAdapter { private Context context; private ArrayList<ListItem> items; private boolean isAble; public ListAdapter(Context context, ArrayList<ListItem> items) { this.context = context; this.items = items; } @Override public int getCount() { return items.size(); } @Override public ListItem getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null); holder.mDelete_Item_root = (DeleteView) convertView.findViewById(R.id.GrafDelete_root); holder.ll_content = (LinearLayout) convertView.findViewById(R.id.ll_content); holder.re_select = (RelativeLayout) convertView.findViewById(R.id.re_select); holder.select = (ImageView) convertView.findViewById(R.id.select); holder.ab_view_bg = (AbsoluteLayout) convertView.findViewById(R.id.ab_view_bg); holder.text_title = (TextView) convertView.findViewById(R.id.text_title); AbsoluteLayout ab_delete_bg = (AbsoluteLayout) convertView.findViewById(R.id.ab_delete_bg); holder.view_delete_bg = convertView.findViewById(R.id.view_delete_bg); TextView text_delete = (TextView) convertView.findViewById(R.id.text_delete); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (isAble) {//Open edit DeleteView.LayoutParams layoutParams = new DeleteView.LayoutParams(920, 180); layoutParams.leftMargin = 0; holder.ll_content.setLayoutParams(layoutParams); ((DeleteView) convertView).setEnAbleHorizontalScroll(false); } else {//Editing is not open DeleteView.LayoutParams layoutParams = new DeleteView.LayoutParams(920, 180); layoutParams.leftMargin = -80; holder.ll_content.setLayoutParams(layoutParams); ((DeleteView) convertView).setEnAbleHorizontalScroll(true); } if (items.get(position).isSelected) { holder.select.setBackgroundResource(R.mipmap.item_selected1); } else { holder.select.setBackgroundResource(R.mipmap.item_select_un); } View.OnTouchListener listener = new View.OnTouchListener() { boolean select_out, delete_out; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: switch (v.getId()) { case R.id.re_select: select_out = false; break; case R.id.view_delete_bg: holder.view_delete_bg.setAlpha(0.5f); delete_out = false; break; } break; case MotionEvent.ACTION_MOVE: switch (v.getId()) { case R.id.re_select: int x = (int) event.getX(); int y = (int) event.getY(); if (x < 0 || y < 0 || x > holder.re_select.getWidth() || y > holder.re_select.getHeight()) { select_out = true; } break; case R.id.view_delete_bg: int x2 = (int) event.getX(); int y2 = (int) event.getY(); if (x2 < 0 || y2 < 0 || x2 > holder.view_delete_bg.getWidth() || y2 > holder.view_delete_bg.getHeight()) { holder.view_delete_bg.setAlpha(1.0f); delete_out = true; } break; } break; case MotionEvent.ACTION_UP: switch (v.getId()) { case R.id.re_select: if (select_out) { return true; } if (items.get(position).isSelected) { items.get(position).isSelected = false; holder.select.setBackgroundResource(R.mipmap.item_select_un); } else { items.get(position).isSelected = true; holder.select.setBackgroundResource(R.mipmap.item_selected1); } break; case R.id.view_delete_bg: holder.view_delete_bg.setAlpha(1.0f); if (delete_out) return true; if (isAble) return true; break; } break; case MotionEvent.ACTION_CANCEL: switch (v.getId()) { case R.id.re_select: break; case R.id.view_delete_bg: holder.view_delete_bg.setAlpha(1.0f); break; } break; } return true; } }; holder.re_select.setOnTouchListener(listener); holder.view_delete_bg.setOnTouchListener(listener); holder.text_title.setText(items.get(position).mString); return convertView; } private class ViewHolder { TextView text_title; RelativeLayout re_select; ImageView select; AbsoluteLayout ab_view_bg, ab_delete_bg; View view_delete_bg; // TextView text_delete; LinearLayout ll_content; DeleteView mDelete_Item_root; } /** * You can edit */ public void setIsAble(boolean b) { if (b == isAble) { return; } else { isAble = b; notifyDataSetChanged(); } } } ``` Activity: ``` public class MainActivity extends AppCompatActivity { private ListView listView; private TextView tv_button; private ArrayList<ListItem> mArrayList = new ArrayList<>(); private boolean isAble; private ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); tv_button = (TextView) findViewById(R.id.tv_button); getListItem(); adapter = new ListAdapter(this, mArrayList); listView.setAdapter(adapter); setListener(); } public void setListener() { View.OnTouchListener listener = new View.OnTouchListener() { boolean delete_out; @Override public boolean onTouch(View arg0, MotionEvent arg1) { switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: switch (arg0.getId()) { case R.id.tv_button: tv_button.setAlpha(0.5f); delete_out = false; break; } break; case MotionEvent.ACTION_MOVE: switch (arg0.getId()) { case R.id.tv_button: int x2 = (int) arg1.getX(); int y2 = (int) arg1.getY(); if (x2 < 0 || y2 < 0 || x2 > tv_button.getWidth() || y2 > tv_button.getHeight()) { tv_button.setAlpha(1.0f); delete_out = true; } break; } break; case MotionEvent.ACTION_UP: switch (arg0.getId()) { case R.id.tv_button: tv_button.setAlpha(1.0f); if (delete_out) return true; changeState(); break; } break; case MotionEvent.ACTION_CANCEL: switch (arg0.getId()) { case R.id.tv_button: tv_button.setAlpha(1.0f); break; } } return true; } }; tv_button.setOnTouchListener(listener); } //点编辑或完成时切换状态 private void changeState() { if (isAble) { isAble = false; tv_button.setText("编辑"); } else { isAble = true; tv_button.setText("完成"); } adapter.setIsAble(isAble); } private void getListItem() { for (int i = 0; i < 20; i++) { ListItem listItem = new ListItem(); listItem.mString = i + "\t" + "ScrollView and HorizontalScrollView conflict"; mArrayList.add(listItem); } } } ```
关于竖屏相机调用横版拍照的系统相机问题
在我的程序里面,有个Activity是锁定竖屏的,点击拍照按钮,将会调用系统的相机进行拍照,现在遇到的问题是:如果这个系统相机是默认横屏拍照的,那么在程序跳转会发生横竖屏切换,在拍照返回结果的时候,我的Activity被重新创建了! 试过这个方法: 下面记录一下开发中遇到的问题,说道这里不得不吐槽一下三星的相机,调用之后系统会调用ondestroy导致activity被销毁重建,原因是系统调用了一次横竖屏切换,解决方法如下 方法一:刚开始调用了onSaveInstanceState(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)这个方法来实现,虽然方法比较笨,但是可以通过在onSaveInstanceState中保存一些你需要的变量,在onCreate()方法中判断savedInstanceState是否为null,不为null则调用onRestoreInstanceState()方法取出之前存的变量来使用,这相当于重新加载了一边当前activity。 方法二:上面的方法可行,但并不是解决问题的根本办法,后来通过查看发现在调用相机时,activity从竖屏切换到了横屏,在横竖屏切换导致了activity重新装载,找到根本原因后,在activity中通过android:configChanges="orientation|keyboardHidden" 这个属性,可以约束调用相机时,保持当前activity竖屏状态不变,从而解决了activity重新加载的问题。 ``` ``` 但是并不起作用。在拍照的时候,还是会出现问题。 另外也试过这个:http://www.zhihu.com/question/21541629(android 调用三星i9300系统相机出现Activity 自动onDestory?) 这个方案能保证Activity不被销毁,但是无法区分是拍照结果是取消还是确定,因为每一次调用返回的都是同一个值 所以想问一下,有没有什么处理方法 (我观察过,QQ也是调用系统相机,但是他不敢是在三星手机还是在其他手机上面,都能够很好的兼容,而58和赶集则是采用自己定义的相机,可能很大的原因就是避开系统相机的兼容性,更何况各种其他第三方相机) http://ask.csdn.net/#
关于Android Slidemenu的问题
public class SlideMenu extends HorizontalScrollView{ private LinearLayout mWapper; private ViewGroup mMenu; private ViewGroup mContent; private int mScreenWidth; private int mMenuRightPadding; private int mMenuWidth = 0; private boolean once = false; //Menu是否处于显示状态 private boolean isSlideOut; public static final int RIGHT_PADDING = 100; public SlideMenu(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(metrics); mScreenWidth = metrics.widthPixels; //将dp转化为px mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, SlideMenu.RIGHT_PADDING, context.getResources().getDisplayMetrics()); } /** * 设置子View的宽和高 * 设置自己的宽和高 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub if(!once){ mWapper = (LinearLayout) getChildAt(0); mMenu = (ViewGroup) mWapper.getChildAt(0); mContent = (ViewGroup) mWapper.getChildAt(1); mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding; mContent.getLayoutParams().width = mScreenWidth; once = true; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** * 通过设置偏移量将Menu隐藏 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub super.onLayout(changed, l, t, r, b); if(changed){ this.scrollTo(mMenuWidth, 0); } } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_UP: //隐藏在左边宽度 int scrollX = getScrollX(); if(scrollX >= mMenuWidth /2){ //Menu 左滑隐藏起来 this.smoothScrollTo(mMenuWidth, 0); isSlideOut = false; }else{ //Menu 右滑 显示出来 this.smoothScrollTo(0, 0); isSlideOut = true; } return true; } return super.onTouchEvent(ev); } /** * 向右滑出菜单显示出来 */ public void slideOutMenu(){ if(!isSlideOut){ this.smoothScrollTo(0, 0); isSlideOut = true; }else{ return; } } /** * 向左滑出菜单隐藏起来 */ public void slideInMenu(){ if(isSlideOut){ this.smoothScrollTo(mMenuWidth, 0); isSlideOut = false; }else{ return; } } /** * 切换菜单向右滑出显示或向左滑出隐藏的状态 */ public void switchMenu(){ if(isSlideOut){ slideInMenu(); }else{ slideOutMenu(); } } ``` public class MainActivity extends Activity { //这个是声明一个自定义的那个控件 private SlideMenu xcSlideMenu; //这个是声明页面上的头像的那个image控件的ID private TextView btnSwitch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); xcSlideMenu = (SlideMenu) findViewById(R.id.slideMenu); btnSwitch = (TextView)findViewById(R.id.btnSwitch); //给声明的image控件添加点击监听事件 btnSwitch.setClickable(true); btnSwitch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 表示点击触发控件内部的右划和左划的事件 xcSlideMenu.switchMenu(); //btnSwitch.setVisibility(View.INVISIBLE); } }); } ``` 上面是相关的类 在主活动的界面中可以滑动,也可以按动btnSwitch来实现侧滑,想请教各位大神如何关闭手势滑动,而仅用按钮来实现滑动 ![图片说明](https://img-ask.csdn.net/upload/201605/10/1462895555_46410.jpg)
startservice之后onstartcommand却没有启动
mainactivity代码 package com.example.test_01; //import android.R; import java.util.List; import com.example.service.PlayerService; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageButton; public class MainActivity extends ActionBarActivity implements MainFragment.OnMainFragmentInteractionListener, MyMusicFragment.OnMyMusicFragmentInteractionListener { //记录当前播放器的状态 private boolean isPause; private FragmentManager fragmentManager; private FragmentTransaction fragmentTransaction; private MainFragment mainFragment; private MyMusicFragment myMusicFragment; //查找歌曲的类 private FindSongs finder; //歌曲列表 public static List<Mp3Info> mp3Infos; //音乐的位置 public static int music_position; //播放按钮控件 private ImageButton play_button; /* 这个方法是activity和fragment通信的一种方法 在MainFragment中调用这个方法,可以在activity中做出相应的反应 */ public void onMainFragmentInteraction(int msg){ /* 对其中的参数msg做出判断,如果为CHANGE_TO_MY_MUSIC_FRAGMENT 则执行跳转 */ if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){ /* 在这里并没有直接切换Fragment 而是调用了activity实现MyMusicFragment的那个接口 对后面的开发能带来一点便利之处 */ onMyMusicFragmentInteraction (AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT); } } public void onMyMusicFragmentInteraction(int msg){ myMusicFragment = new MyMusicFragment(MainActivity.this); //创建了MyMusicFragment的实例 FragmentManager fragmentManager = getFragmentManager(); //得到FragmentManager FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //得到fragmentTransaction if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){ fragmentTransaction.replace(R.id.fragment_layout, myMusicFragment); fragmentTransaction.addToBackStack(null); //这句话是将被替换的MainFragment加入到一个专门存放fragment的栈中,在回退的时候显示上一个Fragment fragmentTransaction.commit(); } if(msg == AppConstant.PlayerMsg.BACK_TO_MAIN_FRAGMENT){ fragmentTransaction.replace(R.id.fragment_layout, mainFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } } public void onMyMusicFragmentInteraction(int msg,int position){ if(msg == AppConstant.PlayerMsg.LIST_CLICK){ if (mp3Infos != null) { // Log.i("dada", "-------------here------------"); isPause = false; initService(position); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); music_position = 0; finder = new FindSongs(); mp3Infos = finder.getMp3Infos(getContentResolver()); play_button = (ImageButton)findViewById(R.id.play_button); //mainFragment = new MainFragment(); //创建了刚才定义的MainFragment实例 mainFragment = new MainFragment(MainActivity.this); fragmentManager = getFragmentManager(); //得到FragmentManager fragmentTransaction = fragmentManager.beginTransaction(); //得到fragmentTransaction,用于管理fragment的切换 fragmentTransaction.replace(R.id.fragment_layout, mainFragment).commit(); //将MainActivity里的布局模块fragment_layout替换为mainFragment } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void initService(int position) { music_position = position; Mp3Info mp3Info = mp3Infos.get(position); /* 这里新建了一个Intent 里面存放各种即将传给Service的数据 要启动自定义PlayerService类 还需要在AndroidManifest中加入如下代码 <service android:name="com.example.dada.myapplication.PlayerService" android:exported="false" > </service> */ //Intent intent = new Intent("com.example.service.PlayerService"); Intent intent = new Intent(MainActivity.this, PlayerService.class); play_button.setImageResource(R.drawable.play_pause); intent.putExtra("url", mp3Info.getUrl()); intent.putExtra("title", mp3Info.getTitle()); intent.putExtra("artist", mp3Info.getArtist()); intent.putExtra("album", mp3Info.getAlbum()); intent.putExtra("album_id", mp3Info.getAlbum_id()); intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG); intent.setClass(MainActivity.this, PlayerService.class); startService(intent); Log.w("dada", "------------hahaha----------"); } //@Override // public void onFragmentInteraction(int msg) { // // TODO Auto-generated method stub // // } } service代码 package com.example.service; import java.io.IOException; import com.example.test_01.AppConstant; import com.example.test_01.AppConstant.PlayerMsg; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.util.Log; public class PlayerService extends Service implements AppConstant { public static MediaPlayer mediaPlayer = null; private int current_position; private String musicPath; private String music_artist; private String music_title; private String notification_msg; //private MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { Log.w("dada", "-------------here------------"); return null; } /* * onStartCommand()方法就是刚启动service时调用的一个方法 * 里面第一个参数intent就是在activity中的那个intent * 因此里面包含着被点击的歌曲相关信息 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { //MediaPlayer是android中自带的一个播放器类,直接实例化后使用即可 mediaPlayer = new MediaPlayer(); Log.w("dada", "-------------here------------"); try { int msg = intent.getIntExtra("MSG", 0); musicPath = intent.getStringExtra("url"); //从intent中拿出歌曲的路径 Log.w("dada", "-------------here------------"); if (msg == AppConstant.PlayerMsg.PLAY_MSG) { playMusic(0); } } catch (Exception e) { e.printStackTrace(); } return 0; } private void playMusic(int position) { Log.w("dada", "-------------here------------"); try { mediaPlayer.reset(); mediaPlayer.setDataSource(musicPath); mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(new MyPreparedListener(position)); } catch (IOException e) { e.printStackTrace(); } } private class MyPreparedListener implements MediaPlayer.OnPreparedListener { private int position; public MyPreparedListener(int position) { this.position = position; } public void onPrepared(MediaPlayer mp) { if (position > 0) Log.i("dada", "-------------here------------"); mediaPlayer.seekTo(position); mediaPlayer.start(); } } private void stopMusic() { if (mediaPlayer != null) { mediaPlayer.pause(); } } public void onDestory() { Log.e("dada", "-------------here------------"); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); } } } startService(intent);后面的log显示了,但是service却没有反应
在listview中找到点击的行,获取数据
我使用自定义的 adapter在ArrayList中显示items。每一行item都2个 textViews和1个按钮。 依据一个属性的状态,在图像按钮上的图像会改变。当点击image button时,如何从行的item(orderID )中或取信息? public class OrderedAdapter extends ArrayAdapter<RMOrder> { private Context context; private RMOrder rowItem; private ListView lv; private int clickedID; private ArrayList<RMOrder>items; private int orderID; private ViewHolder holder; public OrderedAdapter(Context context, int textViewResourceId, List<RMOrder> objects) { super(context, textViewResourceId, objects); this.context = context; } /*private view holder class*/ private class ViewHolder { ImageButton deleteButton; TextView txtMenuName; TextView txtMenuDesc; TextView txtMenuPrice; int orderID; } public View getView(final int position, View convertView, ViewGroup parent) { holder = null; rowItem = getItem(position); LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = mInflater.inflate(R.layout.basket_list_row, null); holder = new ViewHolder(); holder.txtMenuName = (TextView) convertView.findViewById(R.id.menuNameText); holder.txtMenuDesc = (TextView) convertView.findViewById(R.id.menuDetailText); holder.deleteButton = (ImageButton) convertView.findViewById(R.id.menuDelete); holder.txtMenuPrice = (TextView) convertView.findViewById(R.id.menuPrice); holder.orderID = 0; lv = (ListView) convertView.findViewById(R.id.orderedList); convertView.setTag(holder); } else holder = (ViewHolder) convertView.getTag(); String detailsString = ""; double price = rowItem.getPrice(); for (RMOption i : rowItem.getOption()) { detailsString += "-" + i.getName(); price += i.getExtraPrice(); } holder.orderID = rowItem.getId(); holder.txtMenuName.setText(rowItem.getMenuName()); holder.txtMenuDesc.setText(detailsString); holder.txtMenuPrice.setText(Double.toString(price) + " TL"); holder.deleteButton.setFocusable(false); items = new ArrayList<RMOrder>(GlobalList.orderedItemsList.values()); clickedID = items.get(position).getId(); orderID = holder.orderID; //change image of image button if(rowItem.getStatus().equals("pending")){ holder.deleteButton.setImageResource(R.drawable.rsz_pending); holder.deleteButton.setOnClickListener(new OnClickListener() { //TODO Burada tıklananı bulmakta sıkıntı var public void onClick(View v) { //GET ORDER ID } }); else holder.deleteButton.setImageResource(R.drawable.rsz_approved); } return convertView; }
activity传值,没传过去唉
怎么才能从activity中传gps的值到myservice中,我的gps数据传不过去,求大佬解答 ``` public class MainActivity extends Activity { //地图相关 Workspace mWorkspace; MapView mMapView; private static Map m_map; private ZoomControls m_zoom; private LocationManager gpsLocationManager; public static Location lastLocation = null; private static Navigation mNavigation; private static Track m_track; private ImageButton ib_loc; private int screenWidth; private int screenHeight; String rootPath = android.os.Environment.getExternalStorageDirectory ().getAbsolutePath (); //设置全局变量并初始化 Point2D curLocation = new Point2D ( ); Point2D point2d= new Point2D ( ); private static Point2D mPoint; //是否第一次定位,如果是第一次定位的话要将自己的位置显示在地图中间 boolean isFirstOpen = true; //轨迹相关 public static boolean m_EnableLocationService; private Button btn_recording,btn_stop; private Layers m_Layers; public static double mlocationY,mlocationX; private boolean m_ExitEnable = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate ( savedInstanceState ); power(); Environment.setLicensePath ( rootPath + "/SuperMap/license/" ); Environment.setTemporaryPath ( rootPath + "/SuperMap/temp/" ); Environment.setWebCacheDirectory ( rootPath + "/SuperMap/WebCache/" ); Environment.initialization ( this ); startMyLocationServerce (); // 隐藏标题栏 requestWindowFeature ( Window.FEATURE_NO_TITLE ); // 隐藏状态栏 getWindow ().setFlags ( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); WindowManager manager = getWindowManager (); screenWidth = manager.getDefaultDisplay ().getWidth (); screenHeight = manager.getDefaultDisplay ().getHeight (); setContentView ( R.layout.activity_main ); //打开地图 openMap (); //获取地图控件 initView (); //定位监听 initLocationListener (); //第一次定位返回定位点 firstLocation (); initTrack (); } private void power() { List<String> permissionList = new ArrayList<> (); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.RECORD_AUDIO); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.CAMERA); } if (!permissionList.isEmpty()) { String[] permissions = permissionList.toArray(new String[permissionList. size()]); ActivityCompat.requestPermissions(MainActivity.this, permissions, 1); } else { } } private void initView() { m_zoom = (ZoomControls)findViewById(R.id.zoomControls1); mMapView = (MapView)findViewById(R.id.mapView); m_zoom.setIsZoomInEnabled(true); m_zoom.setIsZoomOutEnabled(true); ib_loc = findViewById ( R.id.ib_loc ); btn_recording = findViewById ( R.id.btn_recording ); btn_stop = findViewById ( R.id.btn_stop ); //放大按钮 m_zoom.setOnZoomInClickListener(new View.OnClickListener(){ public void onClick(View v) { m_map.zoom(2); m_map.refresh(); } }); //缩小按钮 m_zoom.setOnZoomOutClickListener(new View.OnClickListener(){ public void onClick(View v) { m_map.zoom(0.5); m_map.refresh(); } }); //返回当前位置 ib_loc.setOnClickListener ( new View.OnClickListener () { @Override public void onClick(View v) { m_map.setCenter ( point2d ); m_map.refresh (); } } ); btn_recording.setOnClickListener ( new View.OnClickListener () { @Override public void onClick(View v) { track(); updateLocation (); } } ); btn_stop.setOnClickListener ( new View.OnClickListener () { @Override public void onClick(View v) { m_track.stopTrack (); m_EnableLocationService = false; } } ); m_map.refresh(); } private void firstLocation(){ MapControl mapControl = mMapView.getMapControl (); mapControl.zoomTo ( 1,50000 ); //设置地图缩放等级 TextView tv1; tv1 = findViewById ( R.id.tv1 ); if(lastLocation != null){ if(isFirstOpen){ m_map.setCenter ( point2d ); m_map.refresh (); } isFirstOpen = false; System.out.print ("======================" + point2d ); double la = lastLocation.getLatitude (); double lo = lastLocation.getLongitude (); //测试用,所获取的是第一次定位的信息 tv1.setText ( "维度:" + (la ) + "\n经度" + (lo )); } else { tv1.setText ( "无法获取地理信息" ); } } private void openMap() { // 打开工作空间 mWorkspace = new Workspace (); WorkspaceConnectionInfo info = new WorkspaceConnectionInfo (); info.setServer ( rootPath + "/HiShow/SuperMap/mapData/mqdemo.smwu" ); info.setType ( WorkspaceType.SMWU ); mWorkspace.open ( info ); mMapView = (MapView) findViewById ( R.id.mapView ); MapControl mapControl = mMapView.getMapControl (); m_map = mapControl.getMap (); m_map.setWorkspace ( mWorkspace ); String mapName = mWorkspace.getMaps ().get ( 0 ); m_map.open ( mapName ); m_map.refresh (); mNavigation = mapControl.getNavigation (); mNavigation.setEncryption ( new SuperMapPatent () ); mapControl.setMapParamChangedListener ( mapParameterChangedListener ); } //使用gps定位自己 private void initLocationListener() { gpsLocationManager = (LocationManager) this .getSystemService ( Context.LOCATION_SERVICE ); if (ActivityCompat.checkSelfPermission ( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission ( this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } lastLocation = gpsLocationManager .getLastKnownLocation ( LocationManager.GPS_PROVIDER ); gpsLocationManager.requestLocationUpdates ( LocationManager.GPS_PROVIDER, 1, 1, locationListener ); } //自定义gps定位自己的监听 private final LocationListener locationListener = new LocationListener () { //Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 public void onStatusChanged(String provider, int status, Bundle extras) { updateLocation (); } //Provider被enable时触发此函数,比如网路被打开 public void onProviderEnabled(String provider) { } //Provider被disable时触发此函数,比如网路被关闭 public void onProviderDisabled(String provider) { } //当坐标改变时触发函数 public void onLocationChanged(Location location) { lastLocation = location; updateLocation (); } }; private final MapParameterChangedListener mapParameterChangedListener = new MapParameterChangedListener () { @Override public void scaleChanged(double arg0) { updateLocation (); } @Override public void boundsChanged(Point2D arg0) { updateLocation (); } @Override public void angleChanged(double v) { } @Override public void sizeChanged(int i, int i1) { } }; @Override protected void onDestroy() { super.onDestroy (); gpsLocationManager.removeUpdates ( locationListener ); mMapView.getMapControl ().removeMapParamChangedListener ( mapParameterChangedListener ); } @Override protected void onResume() { super.onResume (); if (ActivityCompat.checkSelfPermission ( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission ( this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000)或最小位移变化超过N米 gpsLocationManager.requestLocationUpdates ( LocationManager.GPS_PROVIDER, 1, 1, locationListener ); } @Override protected void onPause() { super.onPause (); // 取消注册监听 gpsLocationManager.removeUpdates ( locationListener ); } //更新本地经纬度数据 private void updateLocation() { if (lastLocation == null) { return; } // sp = getSharedPreferences("lastLocation", Context.MODE_PRIVATE); // String mSLocationx = sp.getString("latitude", "0.0"); // String mSLocationy = sp.getString("longitude", "0.0"); // Double mLocationx = Double.valueOf(mSLocationx); // Double mLocationy = Double.valueOf(mSLocationy); //地理位置纠偏 curLocation.setX ( lastLocation.getLongitude () + 0.0055 );//经度 curLocation.setY ( lastLocation.getLatitude () + 0.015 );//维度 //地理坐标与投影坐标的转换 PrjCoordSys Prj = m_map.getPrjCoordSys (); if (Prj.getType () != PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE) { Point2Ds points = new Point2Ds (); points.add ( curLocation ); PrjCoordSys desPrjCoorSys = new PrjCoordSys (); desPrjCoorSys.setType ( PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE ); CoordSysTranslator.convert ( points, desPrjCoorSys, Prj, new CoordSysTransParameter (), CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION ); curLocation = points.getItem ( 0 ); mlocationY = curLocation.getY (); mlocationX = curLocation.getX (); //从控制台查看想X、Y的值 // System.out.println ( mlocationX ); // System.out.println(mlocationY); point2d.setX ( mlocationX ); point2d.setY ( mlocationY ); GeoPoint gpsgeoPoint = new GeoPoint (); gpsgeoPoint.setX ( mlocationX ); gpsgeoPoint.setY ( mlocationY ); addCallByName(gpsgeoPoint); } } private void addCallByName(GeoPoint gps){ mMapView.removeAllCallOut (); CallOut callout = new CallOut ( MainActivity.this ); callout.setStyle ( CalloutAlignment.CENTER ); callout.setCustomize ( true ); callout.setLocation ( gps.getX (), gps.getY () ); ImageView image = new ImageView ( MainActivity.this ); image.setBackgroundResource ( R.drawable.location ); callout.setContentView ( image ); mMapView.addCallout ( callout ); } public void startMyLocationServerce(){ new Thread(new Runnable() { @Override public void run() { Intent intentService = new Intent(); intentService.setAction ( "com.lcdx.supermap.myapplication.MyLocationService.START" ); //从3.1以后要注册动态广播 intentService.setClass(MainActivity.this, MyLocationService.class); startService(intentService); } }).start(); } private void initTrack(){ if (m_track != null){ // 设置用户传入GPS数据 m_track.setCustomLocation(true); // 设置距离间隔为3米 m_track.setDistanceInterval(3); // 设置时间间隔为1s m_track.setTimeInterval(20); // 设置匹配道路所在的数据集 m_track.setMatchDatasets(m_map.getWorkspace().getDatasources().get("road").getDatasets()); m_track.setCustomLocation(false); } } /** * 设置用于轨迹记录的GPS数据 * @param gpsData */ private static int count = 0; public static void setGpsData(LocationManagePlugin.GPSData gpsData){ if(m_track != null){ //创建point2d Point2D mPoint = mNavigation.encryptGPS ( gpsData.dLongitude,gpsData.dLatitude ); gpsData.dLongitude = mPoint.getX (); gpsData.dLatitude = mPoint.getX (); m_track.setCustomLocation ( false ); m_track.setGPSData ( gpsData ); count ++; } if(50 == count){ m_map.refresh (); count = 0; } } private void track() { System.out.println("================================6"); Datasource m_Datasource = m_map.getWorkspace().getDatasources().get("track"); System.out.println("================================7"); m_Layers = m_map.getLayers(); System.out.println("================================8"); // 创建数据集 DatasetVector dataset = m_track.createDataset(m_Datasource, "qwe"); System.out.println("================================9"); //设置数据集的投影信息 PrjCoordSys Prj = m_map.getPrjCoordSys(); if (Prj.getType() != PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE) { PrjCoordSys desPrjCoorSys = new PrjCoordSys(); desPrjCoorSys.setType(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE); dataset.setPrjCoordSys(desPrjCoorSys); } //设置轨迹记录的数据集为datas m_track.setDataset(dataset); System.out.println("================================10"); //开始轨迹记录 m_track.startTrack(); System.out.println("================================11"); clearLayers(); System.out.println("================================12"); //添加在图层轨迹记录的点数据 m_Layers.add(dataset, true); System.out.println("================================13"); System.out.println(dataset + "****************************dataset"); m_EnableLocationService = false; System.out.println("================================14"); //刷新地图 m_map.refresh(); System.out.println("================================15"); //开启定位 updateLocation (); } /** * 清除除了底图以外的图层 */ private void clearLayers() { int count = m_Layers.getCount(); for (; count > 1; ) { m_Layers.remove(0); count = m_Layers.getCount(); } } } ``` public class MyLocationService extends Service { public static double mlocationY,mlocationX; public static double douX,douY; private LocationManagePlugin.GPSData gpsData = new LocationManagePlugin.GPSData (); private SharedPreferences sp; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { // TODO Auto-generated method stub System.out.println("onCreate"); super.onCreate(); } @Override public void onDestroy() { // TODO Auto-generated method stub System.out.println("onDestroy"); mHandler.removeCallbacks(mRunnable); super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub mHandler.postDelayed(mRunnable, 400); System.out.println("onStartCommand" + flags + "__" + startId); return super.onStartCommand(intent, flags, startId); } Handler mHandler = new Handler (); Runnable mRunnable = new Runnable () { @Override public void run() { if (MainActivity.m_EnableLocationService) { initGpsData(); MainActivity.setGpsData ( gpsData ); } mHandler.postDelayed(mRunnable, 400); } }; private void initGpsData(){ douX = MainActivity.lastLocation.getLongitude (); douY = MainActivity.lastLocation.getLatitude (); gpsData.dLatitude = mlocationY; gpsData.dLongitude = mlocationX; System.out.println("=========我的Y"+mlocationY); System.out.println("=========我的X"+mlocationX); } } ``` ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
MyBatis研习录(01)——MyBatis概述与入门
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往——自定义View系列教程(10篇) 走出思维困境,踏上精进之路——Android开发进阶精华录 讲给Android程序员看的前端系列教程(40集免费视频教程+源码) 版权声明 本文原创作者:谷哥的小弟 作者博客
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序
Python:爬取疫情每日数据
前言 有部分同学留言说为什么412,这是因为我代码里全国的cookies需要你自己打开浏览器更新好后替换,而且这个cookies大概只能持续20秒左右! 另外全国卫健委的数据格式一直在变,也有可能会导致爬取失败! 我现在已根据2月14日最新通报稿的格式修正了! 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 为什么已经有大量平台做
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
粒子群算法求解物流配送路线问题(python)
粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794 3.确定编码方式和解码策略 3.1编码方式 物流配送路线的
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
情人节来了,教你个用 Python 表白的技巧
作者:@明哥 公众号:Python编程时光 2020年,这个看起来如此浪漫的年份,你还是一个人吗? 难不成我还能是一条狗? 18年的时候,写过一篇介绍如何使用 Python 来表白的文章。 虽然创意和使用效果都不错,但有一缺点,这是那个exe文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。 由于是很早期的文章了,应该有很多人没有看过。 没有看过的,你可以点击这里查看:用Pyt...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
经典算法(19)教你两分钟学会【选择排序】
这篇博客使用图文并茂的方式讲解选择排序算法,并有完整的算法逻辑以及代码实现。
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
明天就是情人节了。这个情人节,注定是一个不能约会的情人节,但不能约会不代表不能浪漫。古人比我们出生早,那些浪漫的诗词早都被他们挖掘一空,比诗词我们肯定没有机会了。好在我们还有Python,不然都不知道该如何表达浪漫。接下来,浪导教你制作一个浪漫的情人节专属贺卡。
Python绘图与可视化
文章目录使用的库Matplotlib程序包绘图命令的扩展及其属性设置 使用的库 Python有很多可视化工具,如:Matplotlib。 Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本、IPython的交互环境下、Web应用程序中使用。如果结合使用一种GUI工具包(如IPython),Matplotlib还具有诸如缩放和平移等交互功能。它不仅支持各...
计算机考研经验总结
计算机考研指导建议背景开始备考时间学校选择复习计划学科复习考研资料和平台心得杂杂答疑 背景     我是广东双非本科计算机类专业,大一高数没学好,英语在大四最后一次考试里过了6级,专业课掌握情况尚好。选择报考暨南大学,因为它的专业课那年只考一门数据结构,而我数据结构学的还不错,不用在专业课上花很多的时间。暨南大学和华师是广东省内仅有的两所211高校,而听说华师学校稍老,环境没有暨大好。 开始备考时...
MySQL表的增删查改(提高篇)
MySQL表的增删查改(基本篇) 接上一篇MySQL表基本的增删查改,下面看一下提高篇: 一、数据库约束 1、约束类型 NOT NULL:不为空约束。创建表时,可以指定某列不为空 UNIQUE :唯一约束。指定某列为唯一的、不重复的 DEFAULT :默认值约束。指定插入数据时,某列为空,设置默认值 PRIMARY KEY : 主键约束。NOT NULL 和 UNIQUE 的结合。确保某列(或两个...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问