Android小笔记(2)
2016-02-18 22:49
603 查看
笔记1:
获取手机当前电量:
1.注册广播:
笔记2:
Android Studio的项目工程目录中build.gradle文件的dexOptions选项中如果javaMaxHeapSize申请的内存大小大于本机内存,会导致该工程运行不起来,适当调小方可运行起来。
笔记3:
mpchartlib.jar中的LineChart类,设置数值格式时结论
可以用此方式表示整型:String.format("%.0f", value),String.format("%.2f", value)小数点后两位
笔记4:
Android模拟返回键功能:
(1)
笔记5:
终端执行
./gradlew clean 删除 工程名/app 目录下的build文件夹
./gradlew build 检查依赖并编译打包,这里注意的是 ./gradlew build 命令把debug、release环境的包都打出来,生成的包在目录 工程名/app/build/outputs/apk/下。
./gradlew assembleDebug 编译并打Debug包
./gradlew assemblexiaomiDebug 编译并打xiaomi的debug包,其他类似
./gradlew assembleRelease 编译并打Release的包
./gradlew assemblexiaomiRelease 编译并打xiaomi的Release包,其他类似
./gradlew installRelease Release模式打包并安装
./gradlew uninstallRelease 卸载Release模式包
笔记6:
build.gradle文件中设置targetSdkVersion 22及以下可以不用考虑申请权限带来的app问题,如果targetSdkVersion 23及以上,打开app就需要考虑6.0系统用户权限处理问题,不处理会造成app因为权限问题闪退。
笔记7:
绝大多数手机ListView不太反弹效果,但是魅族手机厂商改了Rom,默认的ListView有反弹效果,ListView需增加设置:
笔记8:
jenkins自动构建android studio项目发布release包注意事项,signingConfigs与buildTypes不能前后颠倒顺序,如下图所示。
笔记9:
耳机插入拔出的广播:
笔记10:
ScrollView中嵌套ListView或者ListView中嵌套ListView只能显示第一条,问题得到解决代码:
只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
笔记11:
在Activity中响应ListView内部按钮的点击事件的两种方法:
使用接口回调:
Adapter类:
Activity类:
使用抽象类回调:
Adapter类:
以下是布局文件
总结:两种方法都是通过在Activity中实现抽象方法来实现点击时的具体操作,区别在于这个抽象方法是属于接口的成员还是属于抽象类的成员。
获取手机当前电量:
1.注册广播:
private void initReceiver() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(mReceiver, intentFilter); }2.接收广播:
private BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(Intent.ACTION_BATTERY_CHANGED.equals(action)){ //获取当前电量 int level = intent.getIntExtra("level", 0); //电量的总刻度 int scale = intent.getIntExtra("scale", 100); //把它转成百分比 Log.i(TAG, "电池电量为" + ((level * 100) / scale) + "%"); } } };
笔记2:
Android Studio的项目工程目录中build.gradle文件的dexOptions选项中如果javaMaxHeapSize申请的内存大小大于本机内存,会导致该工程运行不起来,适当调小方可运行起来。
笔记3:
mpchartlib.jar中的LineChart类,设置数值格式时结论
private LineChart mChartD; mChartD.getAxisLeft().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.format("%.0f", value); } });
可以用此方式表示整型:String.format("%.0f", value),String.format("%.2f", value)小数点后两位
笔记4:
Android模拟返回键功能:
(1)
Java.lang.Runtime Runtime runtime = Runtime.getRuntime(); runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK);(2)
Android.app.Instrumentation Instrumentation inst = new Instrumentation(); inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
笔记5:
终端执行
./gradlew clean 删除 工程名/app 目录下的build文件夹
./gradlew build 检查依赖并编译打包,这里注意的是 ./gradlew build 命令把debug、release环境的包都打出来,生成的包在目录 工程名/app/build/outputs/apk/下。
./gradlew assembleDebug 编译并打Debug包
./gradlew assemblexiaomiDebug 编译并打xiaomi的debug包,其他类似
./gradlew assembleRelease 编译并打Release的包
./gradlew assemblexiaomiRelease 编译并打xiaomi的Release包,其他类似
./gradlew installRelease Release模式打包并安装
./gradlew uninstallRelease 卸载Release模式包
笔记6:
build.gradle文件中设置targetSdkVersion 22及以下可以不用考虑申请权限带来的app问题,如果targetSdkVersion 23及以上,打开app就需要考虑6.0系统用户权限处理问题,不处理会造成app因为权限问题闪退。
笔记7:
绝大多数手机ListView不太反弹效果,但是魅族手机厂商改了Rom,默认的ListView有反弹效果,ListView需增加设置:
listView.setOverScrollMode(View.OVER_SCROLL_NEVER);即可将ListView的滑动反弹效果禁掉。
笔记8:
jenkins自动构建android studio项目发布release包注意事项,signingConfigs与buildTypes不能前后颠倒顺序,如下图所示。
笔记9:
耳机插入拔出的广播:
/** * 耳机广播 */ public class HeadsetDetectReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_HEADSET_PLUG.equals(action)) { if (intent.hasExtra("state")) { int state = intent.getIntExtra("state", 0); if (state == 1) { Toast.makeText(context, "插入耳机", Toast.LENGTH_SHORT).show(); } else if(state == 0){ Toast.makeText(context, "拔出耳机", Toast.LENGTH_SHORT).show(); } } } } }
笔记10:
ScrollView中嵌套ListView或者ListView中嵌套ListView只能显示第一条,问题得到解决代码:
public static void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); }
只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
笔记11:
在Activity中响应ListView内部按钮的点击事件的两种方法:
使用接口回调:
Adapter类:
public class ContentAdapter extends BaseAdapter implements OnClickListener { private static final String TAG = "ContentAdapter"; private List<String> mContentList; private LayoutInflater mInflater; private Callback mCallback; //注:所有listview的item共用同一个 /** * 自定义接口,用于回调按钮点击事件到Activity * @author Ivan Xu * 2014-11-26 */ public interface Callback { public void click(View v); } public ContentAdapter(Context context, List<String> contentList, Callback callback) { mContentList = contentList; mInflater = LayoutInflater.from(context); mCallback = callback; } @Override public int getCount() { Log.i(TAG, "getCount"); return mContentList.size(); } @Override public Object getItem(int position) { Log.i(TAG, "getItem"); return mContentList.get(position); } @Override public long getItemId(int position) { Log.i(TAG, "getItemId"); return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i(TAG, "getView"); ViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.textView = (TextView) convertView .findViewById(R.id.textView1); holder.button = (Button) convertView.findViewById(R.id.button1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(mContentList.get(position)); holder.button.setOnClickListener(this); holder.button.setTag(position); return convertView; } public class ViewHolder { public TextView textView; public Button button; } //响应按钮点击事件,调用子定义接口,并传入View @Override public void onClick(View v) { mCallback.click(v); } }
Activity类:
//MainActivity需要实现自定义接口 public class MainActivity extends Activity implements OnItemClickListener, Callback{ // 模拟listview中加载的数据 private static final String[] CONTENTS = { "北京", "上海", "广州", "深圳", "苏州", "南京", "武汉", "长沙", "杭州" }; private List<String> contentList; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { mListView = (ListView) findViewById(R.id.listview); contentList = new ArrayList<String>(); for (int i = 0; i < CONTENTS.length; i++) { contentList.add(CONTENTS[i]); } // mListView.setAdapter(new ContentAdapter(this, contentList, this)); mListView.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } /** * 响应ListView中item的点击事件 */ @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { Toast.makeText(this, "listview的item被点击了!,点击的位置是-->" + position, Toast.LENGTH_SHORT).show(); } /** * 接口方法,响应ListView按钮点击事件 */ @Override public void click(View v) { Toast.makeText( MainActivity.this, "listview的内部的按钮被点击了!,位置是-->" + (Integer) v.getTag() + ",内容是-->" + contentList.get((Integer) v.getTag()), Toast.LENGTH_SHORT).show(); } }
使用抽象类回调:
Adapter类:
public class ContentAdapter extends BaseAdapter { private static final String TAG = "ContentAdapter"; private List<String> mContentList; private LayoutInflater mInflater; privateMyClickListener mListener; //注:所有listview的item都共用同一个listener对象!!! public ContentAdapter(Context context, List<String> contentList, MyClickListener listener) { mContentList = contentList; mInflater = LayoutInflater.from(context); mListener = listener; } @Override public int getCount() { Log.i(TAG, "getCount"); return mContentList.size(); } @Override public Object getItem(int position) { Log.i(TAG, "getItem"); return mContentList.get(position); } @Override public long getItemId(int position) { Log.i(TAG, "getItemId"); return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i(TAG, "getView"); ViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.textView = (TextView) convertView .findViewById(R.id.textView1); holder.button = (Button) convertView.findViewById(R.id.button1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(mContentList.get(position)); holder.button.setOnClickListener(mListener); holder.button.setTag(position); //注:这样能使所有listview的item都共用同一个listener,而不用为每个item都设置各自的listener!!! return convertView; } public class ViewHolder { public TextView textView; public Button button; } /** * 用于回调的抽象类 * @author Ivan Xu * 2014-11-26 */ public static abstract class MyClickListener implements OnClickListener { /** * 基类的onClick方法 */ @Override public void onClick(View v) { myOnClick((Integer) v.getTag(), v); } public abstract void myOnClick(int position, View v); } }Activity类:
public class MainActivity extends Activity implements OnItemClickListener { // 模拟listview中加载的数据 private static final String[] CONTENTS = { "北京", "上海", "广州", "深圳", "苏州", "南京", "武汉", "长沙", "杭州" }; private List<String> contentList; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { mListView = (ListView) findViewById(R.id.listview); contentList = new ArrayList<String>(); for (int i = 0; i < CONTENTS.length; i++) { contentList.add(CONTENTS[i]); } //实例化ContentAdapter类,并传入实现类 mListView.setAdapter(new ContentAdapter(this, contentList, mListener)); mListView.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } //响应item点击事件 @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { Toast.makeText(this, "listview的item被点击了!,点击的位置是-->" + position, Toast.LENGTH_SHORT).show(); } /** * 实现类,响应按钮点击事件 */ private MyClickListener mListener = new MyClickListener() { @Override public void myOnClick(int position, View v) { Toast.makeText( MainActivity.this, "listview的内部的按钮被点击了!,位置是-->" + position + ",内容是-->" + contentList.get(position), Toast.LENGTH_SHORT) .show(); } }; }
以下是布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="content" android:textColor="#ff0000" android:textSize="20sp" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:text="Button" android:textColor="#ff0000" android:textSize="20sp" /> </LinearLayout>
总结:两种方法都是通过在Activity中实现抽象方法来实现点击时的具体操作,区别在于这个抽象方法是属于接口的成员还是属于抽象类的成员。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试