码迷,mamicode.com
首页 > 移动开发 > 详细

Android编程小技巧

时间:2016-05-06 15:53:54      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:

1、当有两三个不同类的类且所用方法都一样,需要完成不能的功能,而这个三个类可能都需要同另外一个类进行交互,而直接把这个类的应用到处传递也是很头疼的,这时可用抽象了类来解决这个问题。当然,Fragement完全可以实现这样的功能,但也有它所不能施展的地方。
例:
有三个页面展示的类,为FirstUI、SecondUI、ThirdUI,他们都要实现三个相同的方法。就只需定义一个抽象父类。
代码如下:
抽象父类:

public abstract class BaseUI implements OnclicListener{
    private Context context;

    public BaseUI(Context context){
        this.context = context;
    }
    //获取展示界面
    public abstract View getChild();
    //标识是哪一个界面
    public abstract int getID(); 
    @Override
    public void onClick(View v) {
    //并不是所有的界面都需要有点击事件,需要用到时,在复写这个方法
    }
}

然后FirstUI类如下,其余不在鳌诉:

public class FirstUI extends BaseUI {

    private Context context;
    private TextView view;

    public FirstUI(Context context) {
        super(context);
        this.context = context;
        init();
    }

    public void init(){
        view = new TextView(context);
        LayoutParams params = view.getLayoutParams();
        params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        view.setLayoutParams(params);
        view.setBackgroundColor(color.green);
        view.setText("This is a first page!");
    }

    public View getChild() {
        return view;
    }

    @Override
    public int getID() {
    // TODO Auto-generated method stub
    return Constant.VIEW_FIRST; //建议将这个ID类型放在常量类中,便于统一管理
    }
}

而在进行用户界面切换时,不要给出具体实现类,而是采用字节码,而字节码
也不是任何类型都可以传递进来的,应该只能是BaseUI类的子类。

public void changeUI(Class<? extends BaseUI> targetClazz) {
String key = targetClazz.getSimpleName();//获取类名
        if (viewAche.containsKey(key)) {
            targetUI = viewAche.get(key);
        } else {
            try {
                //得到他的构造器
                Constructor<? extends BaseUI> constructor = targetClazz
                        .getConstructor(Context.class);
                //得到这个父类
                targetUI = constructor.newInstance(getContext());
                viewAche.put(key, targetUI);
            } catch (Exception e) {
                throw new RuntimeException("BaseUI Constructor Error!");
            }
        }
}

2、当有两三个容器各自管理着自己的任务,而第四个容器的内容变化后,
其他容器也应当变化,传统的方式是在第四个容器的内部进行更改,这样
做之后增大他们之间的耦合度,应该采用观察者模式进行解耦,第四个容器
只需通知其他容器,怎么变更数据,就是他们的事情了。
具体做法,可以采用Java类库里的Observable类,也可以自己写一个这样的类(不建议哦!你对自己的编码能力是否有信心),继承它啊!

//继承已有工具类Observable
public class MiddleManager extends Observable {
    private MiddleManager() {
    }
}
private void change() {     
    // 观察者模式,改变监听状态,通知观察者数据改变了
    this.setChanged();
    //otherClass已注册的类的ID
    this.notifyObservers(otherClass.getID());
}

添加观察的对象。

private void init() {
    TitleManager manager = TitleManager.getInstance();
    manager.init(this);
    manager.showLoginTitle();

    BottomManager bottom=BottomManager.getInstrance();
    bottom.init(this);
    bottom.showCommonBottom();

    MiddleManager middle = MiddleManager.getInstance();
    middle.setMiddle(ii_middle);
    middle.changeUI(HallViewPager.class);

    //观察者模式,添加观察者
    middle.addObserver(manager);
    middle.addObserver(bottom);
}

被观察者实现Observer接口,更新数据

//实现Obserever接口,实现Observer的方法
public class TitleManager implements Observer{
@Override
public void update(Observable observable, Object data) {
//干点坏事,别人都不知道
}
}

3、一个组件想要得到当前上下文,可以用父组件来获取,如下:
middle是一个Linearlayout,这样做可以防止当前上下文到处传递引用。

public class ClassTemp{
    public Context getContext() {
           return middle.getContext();
    }
    //通过view自己的父亲那里得到移除的方法,把自己干掉,就是自杀
    public void init(LinearLayout view){
       ViewGroup parent=(ViewGroup)view.getParent();
       parent.removeView(view);
    }
}

4、当使用LinearLayout布局是,发现(图.1)中的情况,这说明布局文件的全屏显示没有起作用,导致的原因是root为空的时候,它不会设置LayoutParams,所做法是自己去填充一下。代码如下:

showInMiddle = (LinearLayout) View.inflate(context, R.layout.il_hall1,
                null);
        if (showInMiddle.getLayoutParams() == null) {
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);
            showInMiddle.setLayoutParams(params);
        }

技术分享

                    图 1 手机界面未填充满效果图(盗图)

5、动态更改ListView的孩子,不影响已经加载的item。
首先为每一个item设置一个tag:
holder.iv_news.setTag(position);
得到要更新的组件:
TextView view = listview.findViewWithTag(position);
进行更新即可;

6、当要在GridView中显示很多个相同的图片,而只是里面的文字不同,比如彩票的号码,他们的背景图片都一样,
只是他们显示的文字不一样,那么现在我就可以用TextView来填充,不用将每张图片都画一遍,那样做的代价是很
大的,例子如下:

@Override
    public int getCount() {
        // TODO Auto-generated method stub
        return endNum;    //你要显示的球的个数
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        **TextView view = new TextView(context);
        DecimalFormat decimalFormat = new DecimalFormat("00");
        view.setText(decimalFormat.format(position + 1));
        view.setBackgroundResource(R.drawable.id_defalut_ball);
        view.setTextSize(16);
        view.setGravity(Gravity.CENTER);**
        return view ;
    }

7、当有多个TextView要显示,并且颜色还不一样,可以用fromHtml进行转化,在也不需要写那么的TextView了,例如:
定义数据:

<![CDATA[注数:&#160;&#160;<font color="#ff0000">NUM</font>&#160;&#160;注&#160;&#160;金额:&#160;&#160;<font color="#ff0000">MONEY</font>元]]>
String noticeInfo = context.getResources().getString(
                R.string.is_shopping_list_notice);
        noticeInfo = StringUtils.replaceEach(noticeInfo, new String[] { "NUM",
                "MONEY" }, new String[] { lotterynumber.toString(),
                lotteryvalue.toString() });

        // Html.fromHtml(notice):将notice里面的内容转换
        notice.setText(Html.fromHtml(noticeInfo));

8、当在做一个手机端程序,需要上传数据到网络,但又苦于用户可能没有网络,此时可以采用离线上传的做法。
首先,在本地数据库你也可能缓存了数据,用户没上传成功一条,你都要记录到本地数据库,已实现数据同步,
但又要避免不断发送和接受重复数据,导致用户流量增加。此时,可以在设计数据库时设计两个表,一个是本地
缓存表,一个是待上传的数据表,每上传成功一个就删去待上传数据表中的数据。这种做法冻结资金表。

9、项目使用的配置文件(bean.properties)必须跟随在src目录下。

10、图片中红色框里的东西代表,当把apk文件变为jar包的时候,让程序去自动管理资源文件的ID,不勾选会出现很蛋疼的问题(资源文件命名规则很重要)。

技术分享

11、Android中点击图标不显示activity界面的办法,在清单文件里设置系统主题不显示界面(锁屏软件用得上哦)。

 android:theme="@android:style/Theme.NoDisplay" />

12、建立杀不死的服务。这个有点狠,违背道德啊,仅供学习测试参考,开发人员慎用,出现后果自负,与本小编无关。
(1)进程守护
创建连个相同的服务,在
@Override
public void onDestroy() {}
方法里对另外一个服务启动,反过来相同,便可以达到目的

(2)广播接收者
用广播监听各种广播事件,当这个时间发生后,便会启动这个服务;

13、Android引用资源位图更改大小方法

//以Drawable取得资源里的图片
Drawable drawable = this.getResources().getDrawable(R.drawable.white);
//设置位图的大小与位置
  drawable.setBounds(0, 0, pointSize, pointSize);
  //创建一个内容为空的位图对象,这个位图对象在内存里是空的,并没有什么内容
Bitmap bitmap = Bitmap.createBitmap(pointSize, pointSize, Config.ARGB_8888);
//创建一个画布,将上面创建的位图画在这个画布上,此时这个画布也是空的,并没有什么东西  
Canvas can = new Canvas(bitmap);
//调用Drawable自身的draw方法,将它自己画在刚才创建的额画布上
  drawable.draw(can);

//最候,便可以得到自己想要多大并且可以在人员位置绘画的drawable资源里的图片
canvas.draw(bitmap,x,y,paint);

14、如何选择最佳存储选项
(1)如果数据可以使用键/值对来标识,那么久使用SharedPreferences对象。
(2)如果需要存储临时数据,勇士内部存储器是一个很好的选择。
(3)有时需要和其他用户共享应用 程序数据,这时候可以将文件存储在设备上的SD卡上。

15、让文本框获得焦点,但不显示输入法面板


 <activity
            android:name="com.example.autoui.MainActivity"
            android:label="@string/app_name"
           android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
  </activity>

Android编程小技巧

标签:

原文地址:http://blog.csdn.net/yqs_love/article/details/51315292

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!