Android小笔记(2)

笔记1:

获取手机当前电量:

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;
    private MyClickListener 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中实现抽象方法来实现点击时的具体操作,区别在于这个抽象方法是属于接口的成员还是属于抽象类的成员。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android笔记系统是一种可以帮助用户记录、整理和分享笔记的应用程序。以下是一些常见的Android笔记系统的特点和功能: 1. 笔记编辑:大多数Android笔记系统都提供了基本的文本编辑功能,用户可以输入、编辑和保存笔记。一些系统还允许用户插入图片、附件和链接等元素,以丰富笔记内容。 2. 分类和标签:许多Android笔记系统允许用户将笔记进行分类和标签,以便更好地组织和查找。这有助于用户根据主题、日期或其他标准将笔记分组,以便快速找到所需的资料。 3. 笔记共享:一些Android笔记系统允许用户将笔记分享到社交媒体平台或与其他人共享。用户可以选择将笔记以链接、邮件或其他形式发送给朋友或同事,以便他们能够方便地查看和评论笔记。 4. 搜索功能:许多Android笔记系统提供强大的搜索功能,用户可以根据关键词、标签或分类快速找到所需的笔记。 5. 提醒和日历集成:一些Android笔记系统与日历应用程序集成,允许用户设置提醒,以便在特定日期或时间提醒用户查看或更新笔记。 6. 云同步:大多数Android笔记系统都支持云同步功能,用户可以将笔记存储在云端,并在多个设备上访问。这有助于用户在不同设备之间同步笔记,并确保数据的安全性和可访问性。 7. 多平台支持:一些Android笔记系统还支持在多个平台上使用,包括iOS、Windows和Mac等。这为用户提供了更多的灵活性和选择。 总之,Android笔记系统为用户提供了一个方便、高效的方式来记录、整理和分享笔记。它们提供了各种功能和工具,以帮助用户更好地组织和查找信息,并与其他人共享和协作。选择一个适合自己的Android笔记系统,可以帮助您更有效地管理您的学习、工作或个人笔记

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值