android 有没有方法判断 到A页面是跳转去的,还是按返回键到的?

android 有没有方法判断 到A页面是跳转去的,还是按返回键到的?

3个回答

可以的。这两种有本质的区别。Activity启动的时候会调用onCreate函数,但是返回按钮回去的,不会再调onCreate函数,之后调用onResume等函数。所以是可以判断的。

u012846783
勤奋的懒惰 虽然赞同了,但是有时候会在系统低内存运行时可能会回收掉此activity,这样按返回键的话一样会重新开始他的生命周期哦。
3 年多之前 回复

跳转的话就传一个值进去,如果能获取到就是跳转来的,如果不是就是返回键从栈里弹出来的。仅供参考。

放到电脑上,你可以试试看,后台运作,,应该可以看出来

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android项目已经实现了扫一扫功能 扫出结果可以在页面显示 怎么加判断让他可以选择跳转浏览器还是在本地显示
Android项目已经实现了扫一扫功能 扫出结果可以在页面显示 怎么加判断让他可以选择跳转浏览器还是在本地显示![图片说明](https://img-ask.csdn.net/upload/201910/10/1570689395_188270.png)在这里怎么写正则 求大佬
Android Studio添加了内部存储读取并且判断用户名和密码之后无法跳转到下一个页面,有没有人帮忙看一下的
package com.example.test; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity { private Button login; private Button register; private EditText etname; private EditText etpwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); login = (Button) findViewById(R.id.btn_login); register = (Button) findViewById(R.id.btn_register); etname = (EditText) findViewById(R.id.et_name); etpwd = (EditText) findViewById(R.id.et_password); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = etname.getText().toString().trim(); String pwd = etpwd.getText().toString().trim(); String content=""; try { FileInputStream fis=this.openFileInput("message.txt"); byte[] buffer = new byte[fis.available()]; fis.read(buffer); content = new String(buffer); Map<String, String> userMap = new HashMap<String, String>(); String[] infos = content.split(":"); userMap.put("name", infos[0]); userMap.put("pwd", infos[1]); fis.close(); return; }catch (Exception e){ if (name.length() == 0 || pwd.length() == 0) { Toast.makeText(MainActivity.this, "输入不能为空", Toast.LENGTH_SHORT).show(); //弹出一个自动消失的提示框 return; } else if ((TextUtils.isEmpty(name)) && (TextUtils.isEmpty(pwd))) { //页面跳转延迟线程 new Thread() { public void run() { super.run(); try { Thread.sleep(500); Intent i = new Intent(MainActivity.this, Activity.class); startActivity(i); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show(); return; } } private FileInputStream openFileInput(String s) { return null; } }); register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(MainActivity.this, RegisterActivity.class); startActivity(i); } }); } }
Android登录跳转的问题
直接看图吧:这是登录前的页面: ![图片说明](https://img-ask.csdn.net/upload/201505/31/1433055294_881474.jpg) 登录后我想让还回到这个页面,并且上面变换成这个样子(怎么判断是否登录然后变换布局已经搞定了): ![图片说明](https://img-ask.csdn.net/upload/201505/31/1433055360_210943.jpg) 如图因为这个页面是在tabhost里的我直接跳到这个页面下边的tabhost就没了,如果跳到mainActivity的话该怎么设置tabhost的默认选中值呢:login跳转和tabhost的部分代码如下: ![图片说明](https://img-ask.csdn.net/upload/201505/31/1433055479_378610.png) 这里我有去在MainActivity里声明public static MainActivity instance=this,然后在login这边声明一个tabhost=this.getTabHost然后如图里代码 tabHost.setCurrentTabByTag("wode"); 但是没有效果。 MainActivity.java ![图片说明](https://img-ask.csdn.net/upload/201505/31/1433055496_67158.png)
Android页面跳转失败(已在AcivityMainfest中声明过)
开始学Android,在写一个软件的注册页面时出现了问题。点击绑定好的页面跳转的按钮,却显示该工程stop,跳转失败。但是!我已经在AndroidMainfest中定义好了activity,实在找不出错误。求助各位。 以下是代码部分。由于发送验证码部分不是我负责的,所以直接在数据类中把验证码定为1111 public class register_1_phone extends Activity{ private Button sure_code; private EditText edit_phone; private EditText edit_code; private Button get_code; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register_1_phone); findView(); sure_code.setOnClickListener(new OnClickListener(){ public void onClick(View v){ String mCode=edit_code.getText().toString().trim(); //获得线程发出的验证码准备与用户输入的验证码比较 boolean judge=isSameCode(mCode); if(judge==true) { Intent intent=new Intent(register_1_phone.this,register_2_user.class); startActivity(intent); } else //弹出对话框显示错误 { creatdialog(); } } private boolean isSameCode(String mCode) { String code=data_share.get_code(); if(code.equals(mCode)) return true; else return false; } private void creatdialog() { AlertDialog.Builder b=new Builder(register_1_phone.this); b.setMessage("您输入的验证码有误,check一下吧~"); b.setTitle("验证码错误"); b.setNegativeButton("重试", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int which){ dialog.dismiss(); } }); b.create().show(); } }); get_code.setOnClickListener(new OnClickListener(){ public void onClick(View v){ String mphone=edit_phone.getText().toString().trim();//获取手机号 boolean judge=isMobile(mphone); if(judge==false) { //如果手机号不合法,提示重输 creatdialog(); } else{ data_share.set_phone(mphone); //接下来新建一个线程去请求验证码 } } //判断手机号是否合法的函数 private boolean isMobile(String mphone) { String num="[1][358]\\d{9}";//【1】表示第一位数字为1,【358】表示第二位必为3/5/8中的一个,\\d{9}表示后面是可以是0~9的数字,有9位 if(TextUtils.isEmpty(mphone)){ return false; } else{ return mphone.matches(num);//字符串是否在给定的正则表达式匹配 } } //创建显示手机号错误的对话框 private void creatdialog() { AlertDialog.Builder b=new Builder(register_1_phone.this); b.setMessage("您输入了一个来自火星的手机号,换个地球手机号吧~"); b.setTitle("手机号错误"); b.setNegativeButton("重试", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int which){ dialog.dismiss(); } }); b.create().show(); } }); } //绑定界面的控件 private void findView() { sure_code=(Button)findViewById(R.id.sure_vrification_code); edit_phone=(EditText)findViewById(R.id.edit_phone); edit_code=(EditText)findViewById(R.id.edit_vrification_code); get_code=(Button)findViewById(R.id.get_vrification_code); } } 点下“下一步后”的情况 ![图片说明](https://img-ask.csdn.net/upload/201612/11/1481428435_344822.png) ![图片说明](https://img-ask.csdn.net/upload/201612/11/1481428444_68937.png)
Android Tablayout切换页面前验证当前fragment页面数据是否正常,否则不切换
用Tablayout,ViewPager和Fragment组合做了一个可以切换tab的页面; 现在可以实现点击fragment的“下一步”按钮实现切换到下一个fragment的操作; 也可以点击tab来自由切换页面; 现在需要实现的效果:如果当前页面是Afragment然后要通过点击tablayout的tab 来切换到Bfragment,但是需要跟Afragment的“下一步”一个效果,就是先验证 Afragment里面的一些输入数据是否有值,如果没有则不给跳转,如果有则可以; 现在不知道应该用什么方法来实现上面的效果,因为tablayout是在Activity, 要怎么去判断Afragment的数据呢? 有没有大神提供可行思路的,在线等,十分感谢!
新手求解,在登录页面判断登录成功后怎么在弹出框的“确定”实现跳转
![图片说明](https://img-ask.csdn.net/upload/201512/14/1450101698_360605.png) 如图所示,不知道这个在哪里设置监听器,因为在 “判断输入的用户是否正确 ”那边弹出框设置的,.setMessage("成功登录").setPositiveButton("确定",null).show();。。。。。。之前class里边设置过监听器如ss,然后null就填ss,但好像不行,发现是两边没在一起。一个在class,一个在public Boolean。光在class设置监听器虽然能跳转但不能判断用户是否正确。希望大神能够帮下忙。目的就是点这个确定能跳转到另外的页面。 class dengluListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 String name = login_username.getText().toString(); String password = login_password.getText().toString(); if (name.equals("") || password.equals("")) { // 弹出消息框 AlertDialog 通过Builder方法,然后用show()来实现 new AlertDialog.Builder(LoginActivity.this).setTitle("错误") .setMessage("帐号或密码不能空").setPositiveButton("确定", null) .show(); } else { isUserinfo(name, password); } } } // 判断输入的用户是否正确 public Boolean isUserinfo(String name, String pwd) { try{ String str="select * from tb_user where name=? and password=?"; Cursor cursor = db.rawQuery(str, new String []{name,pwd}); if(cursor.getCount()<=0){ new AlertDialog.Builder(LoginActivity.this).setTitle("错误") .setMessage("帐号或密码错误!").setPositiveButton("确定", null) .show(); return false; }**else{ new AlertDialog.Builder(LoginActivity.this).setTitle("正确") .setMessage("成功登录").setPositiveButton("确定",null).show(); return true; } ** }catch(SQLiteException e){ createDb(); } return false; }
radiogroup的跳转问题,物理跳转
各位大神:RadioButton如何区别物理点击的代码实现的点击? 有一个TabActivity,该Activity下有个RadioGroup,点击该RadioGroup可以跳转到相应的页面。 现在已经实现了在一个tab里的多个Activity间的跳转(其实就那几个语句)。 一直没实现从一个tab跳到另一个tab的功能,昨天看到这两个语句,实现了:RadioGroup mTabButtonGroup = (RadioGroup) getParent().findViewById(R.id.home_radio_button_group); ((RadioButton) mTabButtonGroup.findViewById(R.id.home_tab_search)).setChecked(true); /*但是这个跳转只是跳转到某个tab当前的activity(保存在savedInstanceState吧),而不能跳到想要的那个activity。*/ 以上的两个语句是执行了和物理点击tab相同的效果(setOnCheckedChangeListener方法中onCheckedChanged的执行情况一样)。可是想要对物理点击与代码执行跳转的判断,不知道怎么实现了。各位大牛望高抬贵手,帮帮忙!谢了。
android 两个页面都用recyclerview,一个正常,另一个报错
第一个页面(没问题) ``` @BindView(R.id.title_tv) TextView titleTv; @BindView(R.id.recycler) RecyclerView recyclerView; @BindView(R.id.refresh) SwipeRefreshLayout refreshLayout; @BindView(R.id.no_details) LinearLayout noDetails; List<WalletDetailsBean.ResultBean.ListBean> transactionList = new ArrayList<WalletDetailsBean.ResultBean.ListBean>(); private TransactionListAdapter adapter; private String token; private int page = 1; .... protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wallet_details); ButterKnife.bind(this); Intent intent = getIntent(); if(intent != null){ token = intent.getStringExtra("token") != null ? intent.getStringExtra("token") : " "; } initTitle(); initView(); initData(token); } .... private void initView() { refreshLayout.setOnRefreshListener(this); refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); refreshLayout.setProgressBackgroundColor(R.color.refresh_bg); initListView(); } private void initListView() { layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); adapter = new TransactionListAdapter(this, transactionList); recyclerView.setAdapter(adapter); recyclerView.setBackgroundColor(Color.WHITE); // 第一次进入页面的时候显示加载进度条 refreshLayout.setProgressViewOffset(true, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics())); refreshLayout.setRefreshing(true); //滚动监听 recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { refreshLayout.setRefreshing(true); page++; if (page <= totalPage) { //根据后台接口 判断当前页是否小于总页 L.e("pageNo:" + page + ",totalPage:" + totalPage); queryTransactionDetails(MywalletDetailActivity.this,token,page); showToast(getResources().getString(R.string.loading)); } else { refreshLayout.setRefreshing(false); showToast(getString(R.string.no_more_data)); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = layoutManager.findLastVisibleItemPosition(); } }); } ``` 两个页面的xml文件都差不多: ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> ... <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:paddingTop="@dimen/common_10" android:background="#eaeaea" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout> ``` 第二个页面: ``` @BindView(R.id.title_tv) TextView titleTv; @BindView(R.id.no_schedule_ll) LinearLayout noScheduleLl; @BindView(R.id.recycler) RecyclerView recyclerView; @BindView(R.id.refresh_myschedule) SwipeRefreshLayout refreshLayout; ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_schedule); ButterKnife.bind(this); withRefreshView = setRefreshView(); intent = getIntent(); userid = intent.getStringExtra("userid"); token = intent.getStringExtra("token"); initView(); loadFromNet(token,pageNo); } /** * 初始化控件 */ private void initView() { titleTv.setText(getResources().getString(R.string.my_schedule)); needHelp.setVisibility(View.VISIBLE); needHelp.setText(getResources().getString(R.string.need_help)); refreshLayout.setOnRefreshListener(this); refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); refreshLayout.setProgressBackgroundColor(R.color.refresh_bg); refreshLayout.setRefreshing(true); /* * 第一次进入页面的时候显示加载进度条 */ refreshLayout.setProgressViewOffset(true, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics())); refreshLayout.setRefreshing(true); initListView(); } private void initListView() { recyclerView.setItemAnimator(new DefaultItemAnimator());//设置item动画 recyclerView.setHasFixedSize(true); //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 //创建默认的线性LayoutManage layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); recyclerView.setBackgroundColor(Color.WHITE); recyclerView.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST));//自定义的分隔线 adapter = new ScheduleAdapter(this, scheduleList); adapter.setOnItemClickListener(new ScheduleAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { startActivity(new Intent(MyScheduleActivity.this, ShowWebViewActivity.class) .putExtra("title",getResources().getString(R.string.riding_details_title)) .putExtra("share",getResources().getString(R.string.riding_details_share)) .putExtra("url", Url.getMyScheduleDetailUrl(true) + "?token=" + token +"&id=" + rideId)); } }); adapter.setOnItemLongClickListener(new ScheduleAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, int position) { } }); recyclerView.setAdapter(adapter); recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { refreshLayout.setRefreshing(true); pageNo++; if (pageNo <= totalPage) { //根据后台接口 判断当前页是否小于总页 L.e("pageNo:" + pageNo + "newsTotalPage:" + totalPage); loadFromNet(token, pageNo); showToast(getResources().getString(R.string.loading)); } else { refreshLayout.setRefreshing(false); showToast(getString(R.string.no_more_data)); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = layoutManager.findLastVisibleItemPosition(); } }); } ``` 跳转到第一个页面正常显示列表,跳转到第二个页面的时候报错 ![图片说明](https://img-ask.csdn.net/upload/201703/26/1490522733_865990.png) 请问是怎么回事,看了一天了还是看不出所以然来。 谢谢~
android viewpager+Fragment切换问题
我切换用的是add方法,已经可以却换过去,那边的测试代码都会自动执行(比如弹框), 但是界面却没有过去,还是停留在原页面只上,请问大神应该怎么解决呢。 public void switchContent(Fragment from, Fragment to) { if (mContent != to) { mContent = to; FragmentTransaction transaction = getFragmentManager().beginTransaction(); if (!to.isAdded()) { // 先判断是否被add过 transaction.hide(from).add(R.id.fl_main_container, to).commit(); // 隐藏当前的fragment,add下一个到Activity中 } else { transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个 } } } 这是我跳转的代码 普通的add跳转我也试过了,也是这个问题
Android——Activity和Fragment 的相关问题
错误内容 ``` java.lang.RuntimeException: Unable to start activity ComponentInfo{com.esen.aixiaobao/com.esen.aixiaobao.application.news.activity.NewsMainActivity}: android.view.InflateException: Binary XML file line #81: Error inflating class fragment at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2344) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396) at android.app.ActivityThread.access$600(ActivityThread.java:163) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1365) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5398) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #81: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at android.view.LayoutInflater.inflate(LayoutInflater.java:352) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:281) at android.app.Activity.setContentView(Activity.java:1889) at com.esen.aixiaobao.application.news.activity.NewsMainActivity.onCreate(NewsMainActivity.java:26) ``` Activity部分代码 ``` public class NewsMainActivity extends FragmentActivity { private Fragment[] fragments; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_fragment_news); FragmentNews fragment = new FragmentNews(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_news, fragment).commit(); fragments = new Fragment[2]; fragments[0] = getSupportFragmentManager().findFragmentById(R.id.fragment_news); fragments[1] = getSupportFragmentManager().findFragmentById(R.id.fragment_focus); getSupportFragmentManager().beginTransaction(). hide(fragments[1]).show(fragments[0]).commit(); } ``` Fragment 相关代码 ``` public class FragmentNews extends Fragment{ private FragmentActivity activity; private MyListView listView; private NewsListViewAdapter adapter; private List<News> newses; //当前页数 private int pageNow = 0; //判断是否加载更多 private boolean isLoading =false; public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ View view = inflater.inflate(R.layout.fragment_news,container,false); return view; } ``` 代码目的,我是想从一个activity(one)跳转到另一个activity(two)上,但是我的 activity(two)是继承FragmentActivity的。 Fragment才是主要显示页面。 ``` public void onClick(View view) { switch (view.getId()) { case R.id.home_family_textview_icon_notify: Intent intent = new Intent(getActivity(), NewsMainActivity.class); startActivity(intent); break; ```
Android 悬浮窗获取点击拖拽事件
之前参照网上例子写过一个demo,实现在Activity中点击最小化按钮,将该Activity finish,并启动servie生成一个悬浮按钮,可点击也可拖拽; 最近工作需要也做一个相似的悬浮窗,悬浮按钮生成了,App被Home也能存在,不会 消失,但该悬浮按钮却没法捕获点击和拖拽事件。 这两个代码几乎一摸一样,请大神们帮忙看下是哪里出的问题,谢谢! 代码如下: package com.example.menqi.myapplication; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; public class MyService extends Service { private WindowManager mWindowManager; private WindowManager.LayoutParams mLayoutParams; /** * float的布局view */ private View mFloatView; private ViewGroup glSurfaceView; private int mFloatWinWidth,mFloatWinHeight;//悬浮窗的宽高 //private int mFloatWinMarginTop,mFloatWinMarginRight; public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { createWindowManager(); createFloatView(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); removeFloatView(); } private void createWindowManager() { // 取得系统窗体 mWindowManager= (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); //计算得出悬浮窗口的宽高 DisplayMetrics metric =new DisplayMetrics(); mWindowManager.getDefaultDisplay().getMetrics(metric); int screenWidth = metric.widthPixels; mFloatWinWidth = screenWidth *1/3; mFloatWinHeight=mFloatWinWidth*4/3; //mFloatWinMarginTop= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_margintop); //mFloatWinMarginRight= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_marginright); // 窗体的布局样式 // 获取LayoutParams对象 mLayoutParams=new WindowManager.LayoutParams(); // 确定爱悬浮窗类型,表示在所有应用程序之上,但在状态栏之下 //TODO? 在android2.3以上可以使用TYPE_TOAST规避权限问题 mLayoutParams.type= WindowManager.LayoutParams.TYPE_TOAST;//TYPE_PHONE mLayoutParams.format= PixelFormat.RGBA_8888; mLayoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; // 悬浮窗的对齐方式 mLayoutParams.gravity= Gravity.LEFT| Gravity.TOP; // 悬浮窗的位置 mLayoutParams.x=70; mLayoutParams.y=210; mLayoutParams.width=mFloatWinWidth; mLayoutParams.height=mFloatWinHeight; } //开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标) private int mTouchStartX, mTouchStartY, mTouchCurrentX, mTouchCurrentY; //开始时的坐标和结束时的坐标(相对于自身控件的坐标) private int mStartX, mStartY, mStopX, mStopY; //判断悬浮窗口是否移动,这里做个标记,防止移动后松手触发了点击事件 private boolean isMove; /** * 创建悬浮窗 */ private void createFloatView() { LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); mFloatView= inflater.inflate(R.layout.floatlayout, null); glSurfaceView= (ViewGroup)mFloatView.findViewById(R.id.VOIPFloatView); //glSurfaceView.setPreserveEGLContextOnPause(true); glSurfaceView.setKeepScreenOn(true); mWindowManager.addView(mFloatView,mLayoutParams); mFloatView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v,MotionEvent event) { int action = event.getAction(); /*if(MotionEvent.ACTION_DOWN == action) { mStartX=mLastX= (int) event.getRawX(); mStartY=mLastY= (int) event.getRawY(); }else if(MotionEvent.ACTION_UP == action) { int dx = (int) event.getRawX() -mStartX; int dy = (int) event.getRawY() -mStartY; if(Math.abs(dx) >5|| Math.abs(dy) >5) { return true; } }else if(MotionEvent.ACTION_MOVE == action) { int dx = (int) event.getRawX() -mLastX; int dy = (int) event.getRawY() -mLastY; mLayoutParams.x=mLayoutParams.x- dx; mLayoutParams.y=mLayoutParams.y+ dy; mWindowManager.updateViewLayout(mFloatView,mLayoutParams); mLastX= (int) event.getRawX(); mLastY= (int) event.getRawY(); } return false;*/ switch (action) { case MotionEvent.ACTION_DOWN: isMove = false; mTouchStartX = (int) event.getRawX(); mTouchStartY = (int) event.getRawY(); mStartX = (int) event.getX(); mStartY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: mTouchCurrentX = (int) event.getRawX(); mTouchCurrentY = (int) event.getRawY(); mLayoutParams.x += mTouchCurrentX - mTouchStartX; mLayoutParams.y += mTouchCurrentY - mTouchStartY; mWindowManager.updateViewLayout(mFloatView, mLayoutParams); mTouchStartX = mTouchCurrentX; mTouchStartY = mTouchCurrentY; break; case MotionEvent.ACTION_UP: mStopX = (int) event.getX(); mStopY = (int) event.getY(); if (Math.abs(mStartX - mStopX) >= 1 || Math.abs(mStartY - mStopY) >= 1) { isMove = true; } break; } //如果是移动事件不触发OnClick事件,防止移动的时候一放手形成点击事件 return isMove; } }); mFloatView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToVOIPActivity(); MyService.this.stopSelf(); } }); /*VideoRendererGui.setView(glSurfaceView, new Runnable() { @Override public void run() { if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) { WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.latestLocalVideoSize,WebRtcHelperEx.latestRemoteVideoSize); } } }); if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) { LogEx.d(TAG,"createFloatView: webrtc instance is alive and we will call resetRenders"); WebRtcHelperEx.getInstance().resetRenders(); WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.VIDEOSIZE_SMALL,WebRtcHelperEx.VIDEOSIZE_BIG); }*/ } private void removeFloatView() { if(mFloatView != null && mWindowManager != null) { mWindowManager.removeView(mFloatView); } } /** * 单击后回到@WebRTCActivity以切换为大尺寸页面 */ private void ToVOIPActivity() { //TODO跳转到Activity Intent intentToActivity = new Intent(this, Main2Activity.class);//WebPhoneIncomingCallActivity来电页面 intentToActivity.setFlags(FLAG_ACTIVITY_NEW_TASK); startActivity(intentToActivity); } } layout <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/VOIPFloatView" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/avcallfloat" android:scaleType="centerInside" /> </FrameLayout> </RelativeLayout> </RelativeLayout>
android 串口通信读取数据,处理问题?求大神帮忙
下面这段代码是我接收串口数据的 private class ReadThread extends Thread { @Override public void run() { super.run(); while (!isInterrupted()) { int size; try { byte[] buffer = new byte[30]; if (mInputStream == null) return; mInputStream.read(buffer); //根据数据协议规则,判断每条数据的长度 size=Integer.parseInt(Integer.toHexString(buffer[2]))+3; if (size > 3) { onDataReceived(buffer, size); //调用更新UI方法 } } catch (IOException e) { e.printStackTrace(); return; } } } } 下来的截图是我处理UI的。 void onDataReceived(final byte[] buffer, final int size) { // TODO Auto-generated method stub MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub String reString=""; if (mReception!=null) { for (int i = 0; i <size; i++) { String hexString=Integer.toHexString(buffer[i]&0xFF); if (hexString.length()==1) { hexString='0'+hexString; } reString+=hexString.toUpperCase(); } mReception.append(reString+"\r\n"); Toast.makeText(getApplicationContext(), "接收成功"+reString, Toast.LENGTH_SHORT).show(); Intent intent=new Intent(MainActivity.this,Main2Activity.class); startActivity(intent); MainActivity.this.finish(); } } }); } 我现在的问题是,当我跳转页面,并关闭当前页面之后,我在新的页面在接收一条数据时,这条数据会让原页面给拦截接收,并再次把跳转页面执行了一遍(就是把新页面打开了两次),之后在发数据,它就可以正常在跳转之后的页面接收了。 为什么啊? 是我那么有加判断,还是我写的代码,跟线程不符 其中要根据接收的消息来更新ui,或跳转页面
viewpager自定义动画如何判断左滑右滑
主体是Viewpager和TabLayout的联动。现在改动Viewpager的滑动动画效果。 效果:页面不再有滑动的效果,滑走的页面直接慢慢消失,滑进来的页面直接慢慢显示。 重写transformPage方法如下,加Animation是因为点击Tab的时候跳转太快,没有缓慢消失缓慢出现的效果。 现在从第一页到第五页切换效果正常。但是反过来从第五页到第一页,每次切换,都会先闪现一下要显示的页面,然后才跑慢慢显示的动画。 试过把条件position < 0改成position < 0||position > 0,但是这样正反切换都闪屏了,实在不知道怎么写向右滑动的条件了。 有没有大神帮忙看一下为什么。 ``` public void transformPage(View view, float position) { int pageWidth = view.getWidth(); //得到view宽 if (flag) { if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. 出了左边屏幕 view.setAlpha(0); } else if (position <= 1) { // [-1,1] if (position < 0) { //消失的页面 Animation animation = AnimationUtils.loadAnimation(context, R.anim.alpha_out); view.startAnimation(animation); view.setTranslationX(-pageWidth * position); //阻止消失页面的滑动 } else { //出现的页面 Animation animation = AnimationUtils.loadAnimation(context, R.anim.alpha_in); view.startAnimation(animation); view.setTranslationX(pageWidth); //直接设置出现的页面到底 view.setTranslationX(-pageWidth * position); //阻止出现页面的滑动 } // Fade the page relative to its size. float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position)); //透明度改变Log view.setAlpha(alphaFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. 出了右边屏幕 view.setAlpha(0); } } } ``` 联动添加动画的代码 mViewPager = (ViewPager) findViewById(R.id.view); TabPagerAdapter adapter = new TabPagerAdapter(getApplicationContext(),mTitleArray,mList); ngGuidePageTransformer = new NGGuidePageTransformer(); ngGuidePageTransformer.setCurrentItem(MyCollection.this,0,mList); mViewPager.setPageTransformer(true,ngGuidePageTransformer); TranslationInterface tempfrag; mViewPager.setAdapter(adapter); mTabLayout = (TabLayout) findViewById(R.id.tab); mTabLayout.setupWithViewPager(mViewPager); alpha_out.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" android:fillBefore="true"> </alpha> alpha_in.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" android:fillBefore="true"> </alpha>
如何优化联盟系统的统计效率
业务逻辑 给一段代码给站长,站长放到他的网站,然后访客访问站长的网站,我们的代码会自动判断访客是否为移动端,如果是,就跳转到指定页面,并且记录跳转的次数。(要区分这段代码是属于哪个站长的,属于哪个广告计划的) 目前的做法: 给站长一段js,链接到系统的一个处理页面。(<script src="xx.com/abc.php?k=xxxx"></script>) 然后abc.php 判断是否为移动端。然后根据传过来的k值,从数据库中找出是哪个站长(因为这个k值是唯一固定的,所以这里做了缓存),哪个广告的。然后通过$_SERVER['HTTP_USER_AGENT']去判断 ipad iphone Android 客户端并且统计,写入数据库。 问题:目前在阿里云的服务器 单核1g内存,日均200万次请求的情况下,cpu已占用25%,请问能否要实现这个业务需求,还有什么思路,或者我这个业务流程有哪里还可以优化的。 目前系统用的是TP框架。
android 关于支付宝移动支付的一些问题
从支付宝官网下载了一个支付的demo。在植入自己的项目时候我把关于支付的代码都抽取出来了。 手机上有支付宝客户端的时候能正常调用。当卸载支付宝后无法调用了。 /** * @date 2016年6月6日 下午7:54:33 * @Class MpayUtils */ package com.example.testzhifu; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Random; import com.alipay.sdk.app.PayTask; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.widget.Toast; public class MpayUtils { private FragmentActivity activity; public MpayUtils(Context context, FragmentActivity activity) { super(); this.activity = activity; } // 商户PID public static final String PARTNER = ""; // 商户收款账号 public static final String SELLER = ""; // 商户私钥,pkcs8格式 public static final String RSA_PRIVATE = ""; // 支付宝公钥 public static final String RSA_PUBLIC = ""; private static final int SDK_PAY_FLAG = 1; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((String) msg.obj); /** * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建议商户依赖异步通知 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档 if (TextUtils.equals(resultStatus, "9000")) { Toast.makeText(activity, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 判断resultStatus 为非"9000"则代表可能支付失败 // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(activity, "支付结果确认中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 Toast.makeText(activity, "支付失败", Toast.LENGTH_SHORT).show(); } } break; } default: break; } }; }; /** * call alipay sdk pay. 调用SDK支付 * */ public void pay(String arg1, String arg2, String arg3) { if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) { new AlertDialog.Builder(activity).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { // } }).show(); return; } String orderInfo = getOrderInfo(arg1, arg2, arg3); /** * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中! */ String sign = sign(orderInfo); try { /** * 仅需对sign 做URL编码 */ sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } /** * 完整的符合支付宝参数规范的订单信息 */ final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(activity); // 调用支付接口,获取支付结果 String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); } /** * create the order info. 创建订单信息 * */ private String getOrderInfo(String subject, String body, String price) { // 签约合作者身份ID String orderInfo = "partner=" + "\"" + PARTNER + "\""; // 签约卖家支付宝账号 orderInfo += "&seller_id=" + "\"" + SELLER + "\""; // 商户网站唯一订单号 orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\""; // 商品名称 orderInfo += "&subject=" + "\"" + subject + "\""; // 商品详情 orderInfo += "&body=" + "\"" + body + "\""; // 商品金额 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服务器异步通知页面路径 orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\""; // 服务接口名称, 固定值 orderInfo += "&service=\"mobile.securitypay.pay\""; // 支付类型, 固定值 orderInfo += "&payment_type=\"1\""; // 参数编码, 固定值 orderInfo += "&_input_charset=\"utf-8\""; // 设置未付款交易的超时时间 // 默认30分钟,一旦超时,该笔交易就会自动被关闭。 // 取值范围:1m~15d。 // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。 // 该参数数值不接受小数点,如1.5h,可转换为90m。 orderInfo += "&it_b_pay=\"30m\""; // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付 // orderInfo += "&extern_token=" + "\"" + extern_token + "\""; // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空 orderInfo += "&return_url=\"m.alipay.com\""; // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用) // orderInfo += "&paymethod=\"expressGateway\""; return orderInfo; } /** * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范) * */ private String getOutTradeNo() { SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault()); Date date = new Date(); String key = format.format(date); Random r = new Random(); key = key + r.nextInt(); key = key.substring(0, 15); return key; } /** * sign the order info. 对订单信息进行签名 * * @param content * 待签名订单信息 */ private String sign(String content) { return SignUtils.sign(content, RSA_PRIVATE); } /** * get the sign type we use. 获取签名方式 * */ private String getSignType() { return "sign_type=\"RSA\""; } }
如何解决ViewPager+Fragment+GridView实现无限滑动时页面切换的卡顿问题?
最近想自己写一个日历组件,思路是使用ViewPager+Fragment+GridView,如图 (https://img-ask.csdn.net/upload/201902/27/1551263494_687583.png) 最外层是一个DialogFragment 如果正常滑动,没有任何问题,但在快速滑动的时候,在滑到Fragment1和4时进行setCurrentItem时,会发生卡顿现象,即没有即时跳转导致已达到边界无法继续滑动的情况 慢滑 (https://img-ask.csdn.net/upload/201902/27/1551269528_523451.gif) 快滑 (https://img-ask.csdn.net/upload/201902/27/1551269556_845553.gif) 我自己尝试过的解决办法: 1. 一开始我以为是Fragment中布局过于复杂,导致在刷新数据时卡顿,但即时我去掉Fragment中的所有布局,仍会发生卡顿现象 2.后来我将问题定位在ViewPager的事件分发上,将ViewPager的自定义,将onInterceptTouchEvent方法复写直接返回true,现象消失,滑动无问题,但由于GridView中需要响应点击事件,所以我又做了事件拦截的判断,但无论怎么判断,只要不直接返回true,该现象就会发生 下面贴上我的部分代码: 1. 我在DialogFragment中为ViewPager绑定监听事件,在onPageScrollStateChanged中判断页面是否跳转,在页面滑到最左最右时进行跳转 ``` //滑动状态监听 override fun onPageScrollStateChanged(p0: Int) { //1时表示正在滑动、2时表示滑动完毕、0时什么都没做,滑动时变化顺序为1>2>0 //在0时设置页面位置互换 if (p0 == 0){ position = calViewPager.currentItem when (position) { 0 -> { //到达最左侧Fragment时,刷新倒数第二个Fragment的数据与其保持一致,然后跳转,刷新部分代码省略 calViewPager.setCurrentItem(2, false) //跳转完成后刷新其余页面,代码省略 } 3 -> { //到达最右侧Fragment时,刷新第二个Fragment的数据与其保持一致,然后跳转,刷新部分代码省略 calViewPager.setCurrentItem(1, false) //跳转完成后刷新其余页面,代码省略 } 2 -> { //数据刷新,代码省略 } 1 -> { //数据刷新,代码省略 } } } } ``` 2.自定义了ViewPager,进行了事件拦截处理 ``` private var xPosition:Float? = null // 滑动点击判断、拦截 override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { val res = super.onInterceptTouchEvent(ev) xPosition = if (ev!!.action == MotionEvent.ACTION_DOWN){ ev.x }else{ if (Math.abs(ev.x - xPosition!!) > 0){ return true }else{ ev.x } } return res } ``` 3.ViewPager的Adapter ``` class MyCalendarViewPagerAdapter(fm: FragmentManager, private var fragmentsList:MutableList<Fragment>): FragmentPagerAdapter(fm){ //Fragment个数 override fun getCount(): Int { return fragmentsList.size } override fun getItem(p0: Int): Fragment { return fragmentsList[p0] } //不销毁Item override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { } override fun getItemPosition(`object`: Any): Int { return PagerAdapter.POSITION_NONE } } ``` 4.在Fragment中是使用回调进行的数据更新,代码就不上了 这个问题已经困扰我两周了 求大佬指点
Android连接SQLserver出现问题
我根据论坛的一个帖子的代码来改的注册界面,但是当传值时系统就崩溃了 显示No message resource found for message property prop.servertype 这是DButil的代码 public class DBUtil { private Connection connection; public static Connection getSQLConnection(String ip, String user, String pwd, String db) { Connection con = null; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + ip + ":1433/" + db, user, pwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static String QuerySQL(String UserName, String Name, String PassWord, String Email) { String result = ""; try { Connection connection = DBUtil.getSQLConnection("94.191.104.***", "sa", "123456", "txl"); String sql = "insert into tuser values(" + UserName + "," + Name + "," + PassWord + "," + Email + ");"; Statement stmt = connection.createStatement();// PreparedStatement stat = connection.prepareStatement(sql); ResultSet rs = stat.executeQuery();//执行查询语句 while (rs.next())//判断是否查询出数据 { result= "1" ; } stmt.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); result += "查询数据异常!" + e.getMessage(); } return result; } public void setConnection(Connection connection) { this.connection = connection; } } 这是注册界面的代码 public class SignActivity extends Activity { private TextView aUseName; private TextView aName; private TextView aPassWord; private TextView aRpassWord; private TextView aEmail; private Button bSign; private Handler handler; boolean isTip1=false,isTip2=false,isTip3=false,isTip4=false; @Override protected void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sign); intView(); initListener(); WorkThread wt=new WorkThread(); wt.start(); } private void initListener() { bSign.setOnClickListener(new View.OnClickListener() { private Editable text; @Override public void onClick(View view) { String UserName = aUseName.getText().toString(); String Name = aName.getText().toString(); String PassWord = aPassWord.getText().toString(); String RpassWord = aRpassWord.getText().toString(); String Email = aEmail.getText().toString(); if (TextUtils.isEmpty(UserName)) {//用户名为空 aUseName.setError("用户名不能为空"); return; } //限制用户名长度在3-10位 if(UserName.length()>10||UserName.length()<3){ aUseName.setError("请输入3-10位数用户名"); return; }else { isTip1=true; } //限制输入密码长度在6-10位 if(PassWord.length()>10||PassWord.length()<6){ aPassWord.setError("请输入6-10位数密码"); return; }else { isTip2=true; } //限制昵称长度 if(Name.length()>7){ aPassWord.setError("请输入7位数以内昵称"); return; } //判断确认密码是否和密码相等 if (PassWord.equals(RpassWord)) {//确认密码和密码相等 isTip3=true; }else { //确认密码和密码不相等 aRpassWord.setError("两次输入密码不相等"); return; } //判断电子邮箱是否为空 if (TextUtils.isEmpty(Email)) {//电子邮箱为空 aEmail.setError("电子邮箱不能为空"); return; } //判断电子邮箱格式 if(Email.matches("[a-zA-Z0-9._-]+@[a-z0-9]+.[a-z]+")){ isTip4=true; }else{ aEmail.setError("电子邮箱格式不正确"); return; } if(isTip1==true&&isTip2==true&&isTip3==true&&isTip4==true) { Message m = handler.obtainMessage();//获取事件 Bundle b = new Bundle(); b.putString("Usename", UserName); b.putString("Name", Name);//以键值对形式放进 Bundle中 b.putString("Password", PassWord); b.putString("Email", Email); m.setData(b); m.what = 0; handler.sendMessage(m); } } }); } class WorkThread extends Thread{ @Override public void run(){ Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Message m) { super.handleMessage(m); Bundle b = m.getData();//得到与信息对用的Bundle String Usename = b.getString("Usename");//根据键取值 String Name = b.getString("Name"); String Password = b.getString("Password");//根据键取值 String Email = b.getString("Email"); DBUtil db = new DBUtil();//调用数据库查询类 String ret = db.QuerySQL(Usename,Name,Password,Email);//得到返回值 if (ret.equals("1"))//为1,页面跳转,登陆成功 { Toast.makeText(SignActivity.this, "注册成功", Toast.LENGTH_SHORT).show(); } Toast.makeText(SignActivity.this, "注册失败", Toast.LENGTH_SHORT).show(); } }; Looper.loop();//Looper循环,通道中有数据执行,无数据堵塞 } } private void intView(){ aUseName =(TextView)findViewById(R.id.ausename); aName=(TextView)findViewById(R.id.aname); aPassWord=(TextView)findViewById(R.id.apassword); aRpassWord=(TextView)findViewById(R.id.arpassword); aEmail=(TextView)findViewById(R.id.aemail); bSign= findViewById(R.id.bsign); } }
安卓sqlite的问题,不能点注册按钮,点了就出错。
安卓sqlite的问题,不能点注册按钮,点了就出错。然后控制台那边提示说是such no table,网上也查找过解决办法,说是把路径定死,可惜不知道哪里写合适,或者试了也不行? 注册java的代码 import java.io.File; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Toast; import android.view.View; import android.view.View.OnClickListener; import android.widget.RadioButton; public class ZhuceActivity extends Activity { private EditText edityhm,edityhmm,edityhxm,edityhsfz,edityhdh,edityhyx; private RadioButton rdman,rdwomen; private RadioGroup rdgroup; private Button yhzhuce; private Button yhfanhui; SQLiteDatabase db; // 声明一个变量zhuceOK。布尔类型 private boolean zhuceok = false; Handler handler; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); db.close(); //不在当前页时会注销此页面 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.zhuce); //获取控件 edityhm = (EditText)findViewById(R.id.edityhm); edityhmm = (EditText)findViewById(R.id.edityhmm); edityhxm = (EditText)findViewById(R.id.edityhxm); edityhsfz = (EditText)findViewById(R.id.edityhsfz); edityhyx = (EditText)findViewById(R.id.edityhyx); edityhdh = (EditText)findViewById(R.id.edityhdh); rdman = (RadioButton) findViewById(R.id.rdman); rdwomen = (RadioButton) findViewById(R.id.rdwomen); rdgroup = (RadioGroup)findViewById(R.id.rdgroup); yhzhuce = (Button)findViewById(R.id.yhzhuce); yhfanhui = (Button)findViewById(R.id.yhfanhui); // 添加监听 yhzhuce.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 自动生成的方法存根 // 获取所有的用户信息,访问网络服务器端,将信息发送给服务器端去处理。 User user = new User(); user.setName(edityhm.getText().toString()); user.setPassword(edityhmm.getText().toString()); user.setYhsfz(edityhsfz.getText().toString()); user.setYhxm(edityhxm.getText().toString()); user.setYhyx(edityhyx.getText().toString()); user.setYhdh(edityhdh.getText().toString()); if (rdman.isChecked()) user.setSex("男"); else user.setSex("女"); if (zhuce(user)) {// 调用zhuce方法,如果注册成功 // 跳转到登录界面 Intent in = new Intent(); in.setClass(ZhuceActivity.this,LoginActivity.class); startActivity(in); // 销毁当前activity ZhuceActivity.this.onDestroy(); } else {// 注册不成功 Toast.makeText(ZhuceActivity.this, "sorry!!,注册失败", Toast.LENGTH_SHORT).show(); edityhm.requestFocus(); } }}); yhfanhui.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent in1 = new Intent(); in1.setClass(ZhuceActivity.this,LoginActivity.class); ZhuceActivity.this.startActivity(in1); } }); } // 添加用户 // User user这段语句是直接 public Boolean zhuce( User user) { Boolean zhuceok = false; String str = "insert into user values(?,?,?,?,?,?,?) "; LoginActivity main = new LoginActivity(); db=SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString() +"/test.dbs",null); main.db = db; try { db.execSQL(str, new String[] { user.getName(),user.getPassword(),user.getYhsfz(),user.getYhxm(), user.getYhyx(),user.getYhdh(),user.getSex()}); zhuceok = true; } catch (Exception e) { main.createDb(); return zhuceok; } return zhuceok; } } 登录java代码 import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class LoginActivity extends Activity { // 声明控件变量 注意变量为null时能 private EditText login_username; private EditText login_password; private Button zhuce; private Button denglu; public static SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); login_username = (EditText)findViewById(R.id.login_username); login_password = (EditText)findViewById(R.id.login_password); zhuce = (Button)findViewById(R.id.zhuce); denglu = (Button)findViewById(R.id.denglu); zhuce.setOnClickListener(new zhuceListener()); denglu.setOnClickListener(new dengluListener()); db = SQLiteDatabase.openOrCreateDatabase(LoginActivity.this.getFilesDir().toString() + "/test.dbs", null); //getFilesDir().toString()是获取存放数据库文件的路径. } //添加一个监听器 class zhuceListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 //生成一个Intent对象 Intent intent = new Intent(); intent.setClass(LoginActivity.this, ZhuceActivity.class); LoginActivity.this.startActivity(intent); } } class dengluListener implements OnClickListener{ @Override public void onClick(View arg0) { // TODO 自动生成的方法存根 String name = login_username.getText().toString(); String password = login_password.getText().toString(); if (name.equals("") || password.equals("")) { // 弹出消息框 AlertDialog 通过Builder方法,然后用show()来实现 new AlertDialog.Builder(LoginActivity.this).setTitle("错误") .setMessage("帐号或密码不能空").setPositiveButton("确定", null) .show(); } else { isUserinfo(name, password); } } } // 判断输入的用户是否正确 public Boolean isUserinfo(String name, String pwd) { try{ String str="select * from user where name=? and password=?"; Cursor cursor = db.rawQuery(str, new String []{name,pwd}); //Cursor 是每行的集合。SQLite 数据库,,,,db.rawQuery执行本地SQL语句查询 if(cursor.getCount()<=0){ new AlertDialog.Builder(LoginActivity.this).setTitle("错误") .setMessage("帐号或密码错误!").setPositiveButton("确定", null) .show(); return false; }else{ new AlertDialog.Builder(LoginActivity.this).setTitle("正确") .setMessage("成功登录").setPositiveButton("确定",new DialogInterface.OnClickListener(){ //设置确定按钮点击的事件Listener,可以直接在这边设置,纠结了好久 @Override public void onClick(DialogInterface dialog, int which) { //实现你的onclick方法 Intent it = new Intent(LoginActivity.this,JiemianActivity.class); startActivity(it); }} ). show(); return true; } }catch(SQLiteException e){ createDb(); } return false; } // 创建数据库和用户表 public void createDb() { db.execSQL("create table user( name varchar(30) primary key,password varchar(30),yhsfz varchar(50)," + "yhxm varchar(30),yhyx varchar(50),yhdh varchar(50),sex varchar(20)"); } //举例如果你触发startButton按钮事件启动线程,而没有触发stopButton按钮事件停止线程,在离开该页面时onDestroy()中的停止线程功能就发挥了作用 protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); db.close(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.login, menu); return true; } } 还有就是声明user对象的属性 public class User { private String name; private String password; private String yhsfz; private String yhxm; private String yhyx; private String yhdh; private String sex; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getPassword(){ return name; } public void setPassword(String password){ this.password = password; } public String getYhsfz(){ return yhsfz; } public void setYhsfz(String yhsfz){ this.yhsfz = yhsfz; } public String getYhxm(){ return yhxm; } public void setYhxm(String yhxm){ this.yhxm = yhxm; } public String getYhyx(){ return yhyx; } public void setYhyx(String yhyx){ this.yhyx = yhyx; } public String getYhdh(){ return yhdh; } public void setYhdh(String yhdh){ this.yhdh = yhdh; } public String getSex(){ return sex; } public void setSex(String sex){ this.sex = sex; } 不知道该如何解决,可能是哪里的代码写错了,望各路大神能指点下,感谢!
asp.netMVC 微商城开发过程 可能是ios系统与安卓系统出现问题!有这方面开发的大哥指点一下
这是ios系统的,输入电话号码之后判断是不是合伙人 然后是就清除Cookie跳转登陆页面,然后登陆就可以了 ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510884440_746255.jpg) ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510884464_608780.jpg) 这是登陆后的 登陆了自己到个人主页了 ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510884483_191495.jpg) 如果是安卓系统的 输入电话号码后 同样清除Cookie跳转登陆页面 但是登陆的时候它又返回上一个页面了 登陆后返回的是这个页面 ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510884572_551578.jpg)
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
计算机网络的核心概念
这是《计算机网络》系列文章的第二篇文章 我们第一篇文章讲述了计算机网络的基本概念,互联网的基本名词,什么是协议以及几种接入网以及网络传输的物理媒体,那么本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。 网络核心 网络的核心是由因特网端系统和链路构成的网状网络,下面这幅图正确的表达了这一点 那么在不同的 ISP 和本地以及家庭网络是如何交换信息的呢?...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me a few
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问