Android学习(一)--第一个项目遇到的一些问题跟解决

来源:互联网 发布:工作日志软件哪个好 编辑:程序博客网 时间:2024/05/16 14:08

app总是崩溃

在刚开始时看《第一行代码》,想试试在创建项目的时候不create Activity,然而捣腾了一下午,发现连最简单的app(只显示一个TextView),总是被强制停止了。然后再创建项目,选择create Activity就正常运行了。估计是配置文件出了错误,还没去找。

知晓当前活动的方法

出自《第一行代码》
首先创建活动收集类,用来管理活动。

import java.util.ArrayList;import java.util.List;import android.app.Activity;public class ActivityCollector {    public static List<Activity> activities=new ArrayList<Activity>();    public static void addActivities(Activity activity){        activities.add(activity);    }    public static void removeActivities(Activity activity){        activities.remove(activity);    }    public static void finishAll(){        for(Activity activity:activities){            if(!activity.isFinishing())                activity.finish();        }    }}

接着创建基本的活动类,知晓当前活动主要是通过Log.d来输出。所以我们这个基本的活动类在onCreate()时输出活动名到日志

package com.example.fuckinghomework;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class BaseActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        Log.d("BaseActivity", getClass().getSimpleName());        ActivityCollector.addActivities(this);    }    @Override    protected void onDestroy(){        super.onDestroy();        Log.d("BaseActivity", getClass().getSimpleName());        ActivityCollector.removeActivities(this);    }}

之后只要将所有的活动类继承这个类就好了。

Layout

RelativeLayout

已经用过的只有RelativeLayout,这个是可以通过距离,相对位置等信息来放置控件在屏幕上的位置,属性非常多,常用的有android:layout_alignParentLeft=”true”这种,即跟xxx的上/下/左/右对齐,这里是跟父布局的左边对齐。android:layout_below=”@+id/xxx”放在xxx的下面。还有其他可以通过距离来设定的,不过兼容性不太好,在分辨率不同的屏幕上效果相差甚远

LinearLayout

没怎么用,感觉比较难用。线性排列

一些控件

TextView

显示当前文本。通过setText(“String”);可以修改显示的内容。setSize(int)修改字号,setColor(int)设置颜色,颜色用的是16进制的,上网查。

Button

按钮,可以通过在代码中addOnClickListener也可以在xml文件中添加一个函数来写按钮事件。注意如果是要在代码中写addOnClickListener的话要import view.View.OnClickListener; 有时按eclipse的提示来添加添加的不是这个包,就会报错。

EditText

可以输入的文本框。在xml中添加android:hint="xxx" 可以添加输入提示

android:maxLines="1"

即将文本框的最大行数设为1行,超过一行之前的文本则会向上滚动
editText.getText().toString()–获取文本框的输入,并转化为字符串

ImageView

图片控件,在上面可以添加图片

imageView.setImage(R.drawable.foo);

将图片设置到imageView上

imageView.setBackground(R.drawable.foo);

将foo设为背景

帧动画

在做这个项目时需要用到动画片那种动画效果,选择了AnimationDrawable这个类,为帧动画,即将很多画面连起来播放,形成动画的效果,不过这个只能用在小图,少图的情况下,一般手机拍摄,电脑下的高清图都很大的,不处理非常容易OOM,然而也没有比较好的处理方法,经查也就提前压缩,或者是先将图片放入内存,不过这样貌似不适合于帧动画,因为我学到的帧动画的设置是先将图片放入drawable-hdpi这些文件下,然后在res/drawable下新建resource type为drawable,Root element为animation-list的xml文件。
添加item。duration 为图片显示的时间长度

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"         android:oneshot="false" >    <item        android:drawable="@drawable/phase_1111"        android:duration="50">    </item>    <item        android:drawable="@drawable/phase_2111"        android:duration="50">    </item>    <item        android:drawable="@drawable/phase_3111"        android:duration="50">    </item>    <item        android:drawable="@drawable/phase_2111"        android:duration="50">    </item>    <item        android:drawable="@drawable/phase_1111"        android:duration="50">    </item></animation-list>

本来想连续播放手机拍摄的图片,但帧动画无法满足(图片多且大,34张,平均每张1M)。就只是通过压缩,然后setImageBitmap的方法来播放。压缩图片的方法在谷歌官网有

package com.example.fuckinghomework;import android.app.Activity;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;public class HandlePicture extends Activity{    /**     *计算压缩的比     *reqWidth,reqHeight为目标宽高     *这里做了修改,因为我的图片可能是横的     *选择比例小的,这样压缩后才全部在要求范围内     */    public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){        final int height=options.outHeight;        final int width=options.outWidth;        int inSampleSize=1;        if(height>width){        if(height>reqHeight||width>reqWidth){            final int heightRatio=Math.round((float)height/(float)reqHeight);            final int widthRatio=Math.round((float)width/(float)reqWidth);            inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;        }        }else{            if(width>reqHeight||height>reqWidth){                final int heightRatio=Math.round((float)width/(float)reqHeight);                final int widthRatio=Math.round((float)height/(float)reqWidth);                inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;            }        }        return inSampleSize;    }    /**     *返回位图     */    public static Bitmap decodeSampleBitmapFromResource(Resources res,int resId,int reqWidth,int reqHeight){        final BitmapFactory.Options options=new BitmapFactory.Options();        options.inJustDecodeBounds=true;//设为true则只解析图片,不将其加载到内存        BitmapFactory.decodeResource(res, resId,options);        options.inSampleSize=calculateInSampleSize(options,reqWidth,reqHeight);        options.inJustDecodeBounds=false;        return BitmapFactory.decodeResource(res, resId,options);    }}

先将图片加载到内存的方法,一种是软引用,查到说现在很少用就没看,另一种是LruCache,但网上的代码不知道为什么不行,没时间就放弃了找问题,毕竟内存这块完全不懂

ProgressBar

进度条
圆形进度条

<ProgressBarandroid:id="@+id/progress_bar"android:layout_width="match_parent"android:layout_height="wrap_content"/>

水平进度条

<ProgressBarandroid:id="@+id/progress_bar"android:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:max="100"/>

max为进度条的最大值。
代码中可以通过getProgress()来获取当前的进度,setProgress(int)来设置当前的进度

控件三种属性

View.VISIBLE,可见。View.INVISIBLE,不可见,仍在那里,透明了。View.GONE不占据屏幕的任何位置了。
方法–setVisiblity(int);

一些小问题

遇到一个问题是说ProgressBar不能转化为TextView的,后来看了xml代码发现,TextView的声明放在了ProgressBar的下面,而我的progressBar中又有android:layout_below="@+id/textView"。将TextView声明移到上面去就好

添加音乐

                MediaPlayer mMediaPlayer==MediaPlayer.create(this, R.raw.music1);                try{                    mBackgroundPlayer.prepare();                }catch(IllegalStateException e){                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                mBackgroundPlayer.start();        mBackgroundPlayer.setOnCompletionListener(new OnCompletionListener(){            @Override            public void onCompletion(MediaPlayer arg0) {                arg0.stop();            }        });
0 0
原创粉丝点击