今天在使用DatePicker时真是被这个控件恶心到了。。。
1.月份的日期不会跟着月份或者年份变动
2.没有闰年的判断
好吧,看来只能自己判断了:
新建一个layout:
choise_date.xml



	

然后新建个类,继承自LinearLayout用来显示在弹出的对话框中:

package com.zhang.test.views;

import java.util.Calendar;
import java.util.GregorianCalendar;

import com.zhang.test.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.DatePicker.OnDateChangedListener;

public class DatePickerDialogView extends LinearLayout {

	private static final String TAG = "DatePickerDialogView";
	private static Context mContext;

	private DatePicker mDatePicker;

	private Calendar mC;

	public DatePickerDialogView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initialize(context);
	}

	public DatePickerDialogView(Context context) {
		super(context);
		initialize(context);
	}

	private void initialize(Context context) {
		mC = Calendar.getInstance();

		mContext = context;
		View view = LayoutInflater.from(mContext).inflate(R.layout.choise_date, null);
		mDatePicker = (DatePicker) view.findViewById(R.id.datepicker_date);
		mDatePicker.init(mC.get(Calendar.YEAR), mC.get(Calendar.MONTH), mC.get(Calendar.DAY_OF_MONTH), onDateChangedListener);

		addView(view);
	}

	/**
	 * 日期更改时监听事件
	 */
	private OnDateChangedListener onDateChangedListener = new OnDateChangedListener() {

		@Override
		public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

			//判断闰年
			boolean mIsLeapYear = ((GregorianCalendar)mC).isLeapYear(year);

			if(mIsLeapYear && monthOfYear == 1 && dayOfMonth > 29) {
				//闰年,2月,天数大于29天
				view.init(year, monthOfYear, 29, onDateChangedListener);
			} else if(mIsLeapYear && monthOfYear == 1) {
				//由于控件bug,只要是闰年,同时月份是2月份,就去init控件
				view.init(year, monthOfYear, dayOfMonth, onDateChangedListener);
			} else if(!mIsLeapYear && monthOfYear == 1 && dayOfMonth > 28) {
				//平年,2月,天数大于28天
				view.init(year, monthOfYear, 28, onDateChangedListener);
			} else if(!mIsLeapYear && (monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {
				//平年,除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天
				view.init(year, monthOfYear, 30, onDateChangedListener);
			} else if((monthOfYear != 1) && ((monthOfYear + 1) % 2 == 0) && (dayOfMonth > 30)) {
				//除2月外,可以被2整出的月份(4,6,8,10,12),月份总天数大于30天
				view.init(year, monthOfYear, 30, onDateChangedListener);
			}
		}
	};

	/**
	 * 获得日期
	 * @return String
	 */
	public String getDate() {
		return mDatePicker.getYear() + "-" + (mDatePicker.getMonth() + 1) + "-" + mDatePicker.getDayOfMonth();
	}

}

主要是使用DatePicker的init方法的对控件变更时进行监听。

最后是activity:

package com.zhang.test;

import java.util.Calendar;

import com.zhang.test.views.DatePickerDialogView;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";
	private static Context mContext;

	private Button btnChange;
	private EditText dateEditText;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mContext = this;
        btnChange = (Button) findViewById(R.id.button_change);
        dateEditText = (EditText) findViewById(R.id.EditText01);

        btnChange.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				AlertDialog.Builder a = new Builder(mContext);
				final DatePickerDialogView dateView = new DatePickerDialogView(mContext);
				a.setTitle("选择日期");
				a.setView(dateView);
				a.setPositiveButton("确定",new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						dateEditText.setText(dateView.getDate());
					}
				});
				a.show();
			}
        });
        Calendar c = Calendar.getInstance();
        dateEditText.setText(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH));
    }
}

通过AlertDialog.Builder弹出一个对话框,再通过对话框的setView方法把刚才自定义的Veiw放进去。

执行结果:

代码:
TestDataPicker

今天发现邮箱中的一封email,打开一看原来是国外一个开发论坛发送的帖子回复提醒。。。那可是我去年发的帖子啊,还有人回。。。
帖子问的是如何才能弹出软键盘,今天又google了下,发现eoeandroid的一个帖子中说可以用Timer来解决这个问题(原帖)

package com.zhang.test;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class MainActivity extends Activity {

	private Context context;

	private EditText mEditText;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		context = this;
		mEditText = (EditText) findViewById(R.id.EditText01);
		mEditText.requestFocus();

		Timer timer = new Timer();
		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				InputMethodManager m = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
				m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
			}

		}, 1000);
	}
}

在载入界面完毕后使用Timer延迟1000毫秒再弹出。

代码:
TestVirtualKeyboard

android中自定义ListView 知道怎样自定义ListView后,也许在开发过程中会遇到这样的需求:
一个Activity,其中不只有ListView一个控件,还有其他的TextView、ImageView、Button等等很多控件,这样很可能会占据屏幕很大一部分,要知道手机的屏幕只有480像素,通常的想法是给这个Activity加上一个ScrollView,让其有滚动条,但是会发现ListView的高度不是随着内容而自动填充的。那么我们可以使用ListView的addHeaderView以及addFooterView 为ListView增加上下的头和尾,这样就可以让ListView填充到整个屏幕。

新建一个Layout:
demo_list_item_header_view.xml:



	

然后新建一个类,继承自LinearLayout用来显示上面的Layout:
DemoListHeaderView.java

package com.zhang.test.view;

import com.zhang.test.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class DemoListHeaderView extends LinearLayout {

	private static final String TAG = "DemoListHeaderView";
	private Context context;
	private TextView textView;

	public DemoListHeaderView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initialize(context);
	}

	public DemoListHeaderView(Context context) {
		super(context);
		initialize(context);
	}

	private void initialize(Context context) {
		this.context = context;
		View view = LayoutInflater.from(this.context).inflate(R.layout.demo_list_item_header_view, null);
		textView = (TextView) view.findViewById(R.id.headerTextView);
		addView(view);
	}

	public void setTextView(String text) {
		textView.setText(text);
	}
}

之后在ListView设置setAdapter之前,一定要在setAdapter之前
加上代码:


        DemoListHeaderView headerView = new DemoListHeaderView(context);
        headerView.setTextView("Header : ");
        listView.addHeaderView(headerView);

        DemoListHeaderView footerView = new DemoListHeaderView(context);
        footerView.setTextView("Footer : ");
        listView.addFooterView(footerView);

全部(根据上一篇文章修改)

package com.zhang.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;

import com.zhang.test.view.DemoListHeaderView;
import com.zhang.test.view.DemoListItemView;
import com.zhang.test.view.adapter.DemoListAdapter;

public class demoActivity extends Activity {

	private static final String TAG = "demoActivity";
	private Context context;
	private ListView listView;
	private ArrayList datas;
	private DemoListAdapter datasAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = this;
        listView = (ListView) findViewById(R.id.listView);
        datas = new ArrayList();
        loadData();
        datasAdapter = new DemoListAdapter(context, datas);

        DemoListHeaderView headerView = new DemoListHeaderView(context);
        headerView.setTextView("Header : ");
        listView.addHeaderView(headerView);

        DemoListHeaderView footerView = new DemoListHeaderView(context);
        footerView.setTextView("Footer : ");
        listView.addFooterView(footerView);

        listView.setAdapter(datasAdapter);
    }

    private void loadData() {
    	DemoListItemView.Data d;
    	for(int i=0; i<10; i++) {
    		d = new DemoListItemView.Data();
    		d.topText = "测试top";
    		d.bottomText = "测试bottom";
    		datas.add(d);
    	}
    }
}

运行结果:

代码:
DemoListView

连续一个月了,总是访问不了,要么说是在换服务器,要么又改IP,搞毛啊!
顺便诅咒下狗屁T….G的垃圾政策

研究了下ListView的自定义item view:
首先,建立一个layout:



	
	

显示结果如下:

*我在这里新建了一个包,用于存放所有view:com.zhang.test.view
然后新建一个类:DemoListItemView 继承自LinearLayout,如果自定义view使用的是其他Layout,那么就继承自其他的Layout,比如RelativeLayout等等。

写入代码:

package com.zhang.test.view;

import java.util.zip.Inflater;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.zhang.test.R;

public class DemoListItemView extends LinearLayout {

	private static final String TAG = "DemoListItemView";
	private Context context;
	private TextView topTextView, bottomTextView;

	public DemoListItemView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initialize(context);
	}

	public DemoListItemView(Context context) {
		super(context);
		initialize(context);
	}

	private void initialize(Context context) {
		this.context = context;
		View view = LayoutInflater.from(this.context).inflate(R.layout.demo_list_item_view, null);
		topTextView = (TextView) view.findViewById(R.id.topTextView);
		bottomTextView = (TextView) view.findViewById(R.id.bottomTextView);
		addView(view);
	}

	public void updateView(Data d) {
		topTextView.setText(d.topText);
		bottomTextView.setText(d.bottomText);
	}

	/**
	 * 自定义数据类型,用于显示当前item所需要的数据
	 * @author zhang
	 *
	 */
	public static final class Data {

		public String topText;
		public String bottomText;

		public Data() { }

		public Data(Data d) {
			topText = d.topText;
			bottomText = d.bottomText;
		}
	}
}

这里面有个内部类:Data。
通常每一个ListView的item都会显示不同内容,那么把每一个item要显示的内容封装成一个类方便赋值。

接下来是Adapter,新建一个类:DemoListAdapter 继承自BaseAdapter。
我在这里也建立了一个包,用于存放所有adapter:com.zhang.test.adapter

package com.zhang.test.view.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.zhang.test.view.DemoListItemView;

public class DemoListAdapter extends BaseAdapter {

	private static final String TAG = "DemoListAdapter";
	private Context context;
	private ArrayList datas;

	public DemoListAdapter(Context context) {
		this.context = context;
	}

	public DemoListAdapter(Context context, ArrayList datas) {
		this.context = context;
		this.datas = datas;
	}

	public void setDatas(ArrayList datas) {
		this.datas = datas;
	}

	public int getCount() {
		return datas.size();
	}

	public Object getItem(int location) {
		return datas.get(location);
	}

	public long getItemId(int location) {
		return location;
	}

	public View getView(int location, View view, ViewGroup parent) {
		if(datas == null) {
			return null;
		}
		if(view == null) {
			DemoListItemView itemView = new DemoListItemView(context);
			itemView.updateView(datas.get(location));
			view = itemView;
		} else {
			((DemoListItemView) view).updateView(datas.get(location));
		}
		return view;
	}

}

adapter中最重要的是getView:
通过重写BaseAdapter中的方法,在实例化这个adapter时传入要显示的数据,然后用getView来显示每一个ListView的item,通过实例化刚才建立的View:DemoListItemView的方法updateView传入要显示在当前位置的数据项,然后返回处理完毕的view。

然后是activity的layout:
layout中只有一个ListView,我们通过在activity中载入数据,然后把数据传给刚才的 DemoListAdapter 的对象,再通过这个ListView的setAdapter方法把数据显示出来。



	
	

activity:

package com.zhang.test;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;

import com.zhang.test.view.DemoListItemView;
import com.zhang.test.view.adapter.DemoListAdapter;

public class demoActivity extends Activity {

	private static final String TAG = "demoActivity";
	private Context context;
	private ListView listView;
	private ArrayList datas;
	private DemoListAdapter datasAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = this;
        listView = (ListView) findViewById(R.id.listView);
        datas = new ArrayList();
        loadData();
        datasAdapter = new DemoListAdapter(context, datas);
        listView.setAdapter(datasAdapter);
    }

    private void loadData() {
    	DemoListItemView.Data d;
    	for(int i=0; i<10; i++) {
    		d = new DemoListItemView.Data();
    		d.topText = "测试top";
    		d.bottomText = "测试bottom";
    		datas.add(d);
    	}
    }
}

activity中定义的几个变量:
listView:layout文件中的ListView
datas:自定义item的view要显示的数据
datasAdapter:DemoListAdapter实例化的对象,赋值后显示在ListView中

整个程序结构:

最终运行结果:

源码下载:
DemoListView.zip

入手了Hero,3130RMB…
照了几张,外观不错:

外观3

外观2

外观1

今天在写程序时遇到一个问题:
通过Bitmap画一张图片,屏幕没有转换时没有问题,当转换3-4次横竖屏后,在createBitmap时报异常:bitmap size exceeds VM budget
google了下都是说一些什么只分配了8m内存啊,及时删掉不用的变量之类的,对我的程序帮助不大…

既然是只有转换横竖屏才会报错,加了个onConfigurationChanged不让activity每次都去调onCreate,oom就不见了.
不过还是没有解决oom的本质问题- -

毫无悬念,魔兽世界必将在中国大陆扎根,无论目前和未来多么难产,它总是要来的!哪怕就是这次走了,它必将还会再来!
  随着我国的国际化进程的加快以及意识形态领域的互相渗透,无论什么人什么机构什么版署部委,都无法阻挡魔兽世界在中国大陆的轰然降落,因为这是潮流,是一个不以任何人意志为转移的世界潮流!哪怕本届版署侥幸获得了权限,成功招架了魔兽的降临,后来的继任者也一定会给魔兽世界大开绿灯!哪怕下届再下下届,一定会有开明和新潮的领导者,把这款游戏带给大陆玩家!
  本来不想为这个鸟事写字,但这些鸟事却不依不饶地拥挤在胸口感觉难受,让我不吐不快!按照惯例,自报家门:一区黑龙军团部落阵营猎人:红尘香帅!一个从05年内测就开始玩魔兽世界的老玩家,当然年龄早过了而立!以证明自己仅仅是玩家而非枪手!
  无奈的网易和暴怒的版署
  网易是一个彻头彻尾的倒霉蛋,但我们更多的玩家却认为网易被人背后砸了黑砖,本来一款已经在大陆正常运行4年多的游戏,在更换代理之后,却被卡了脖子弄得半死,是的,连游戏里一草一木都都没有任何的改变,再将要运行时,却被告知再行审批!
  天下没有比这更加搞笑的,一款消费者享用了几年的产品,生产厂家、原材料以及各项出厂技术指标毫无差别,并且早已通过技术监督局技术鉴定,仅仅更换了经销商,消费者就无权再行享用,道理何在?到现在为止,版署承接审批、正在审批、退回审批、终止运营等行为,我从来没有看到给出哪怕一点点合理的理由!
  杀人治罪也应该找一个貌视冠冕堂皇的借口,版署的借口是:网易在没有版署同意的情况下擅自开服收费!
  请注意:版署要求网易停止运营的理由是:“你不听话,我要打你”,而不是魔兽世界太血腥太暴力太黄色等理由,因为事实非常清楚,魔兽世界是这个星球上最经典最精彩最富有历史内涵和文化底蕴的游戏,没有那款游戏可以和魔兽世界相比,如果你们关闭了服务器,那对不起,80%以上的玩家哪怕把钱扔给台湾代理商,也不会屈尊玩其他的国产游戏,差别太大太大太大了,差别超过一个博士生和一个初中生的知识层次!
  别拿什么爱国的大帽子砸人,游戏就是游戏,谈其他的都是扯淡,和爱不爱国没有任何关系,二战时候美国人把可口可乐卖给正在打仗的德国人,德国人担心可乐里有激素拒绝引用,于是美国人换了一个女性化的名字叫芬达,还是把可乐卖给了德国人!商人有国家但商业没有国界!
  版署既然没有说明这款游戏不适合玩家消费,那么就没有权利剥夺玩家的消费权,至于行政上的口角,那和玩家没有关系!如果你们强迫网易关闭服务器,那就是剥夺玩家的消费权,全国500万玩家真闹出点轰动群体性事件,将来国务院总理会把板子打在你版署的屁股上!
  网易肯定很郁闷,可是更无奈,购买暴雪公司版权花费20亿,在服务器测试阶段每天损失100万,版署还要他们继续免费运营!网易想破脑袋也不明白,为什么一款运行了4年多的游戏,再次上市还需要版署审批?同样一个产品审批两次??
  版署的暴怒摧残着网易的神经,版署下了终止运营通知,可网易的服务器每天还在接纳玩家,目前进入胶着状态,双方都骑虎难下,面对版署这个暴怒的BOSS,网易是宁神射击DOWN掉BOSS?还是灭团?我们静静等待着。。。。
  但我们知道,无论多么貌视强大的BOSS,最后总会被玩家踩在脚下!版署,你还能支持多久?
  角力双方的筹码
  文化部力挺网易,电视台报纸等新闻机构也力挺网易,专家学者讲话也力挺网易,指出版署违背了中编办于网游的“三定”规定!属于越权行为!
  看来网易绝非孤军作战,另外网易还有一个隐蔽的没有爆发的大筹码:500万玩家!这是一个不小的群体,500万相当于一个大城市的全部人口的总和,一旦服务器被迫关闭,那么500万无聊的玩家会闹出什么乱子,只有天知道!目前稳定和谐是目前主题!上次版署就是在玩家的压力下松动口气,允许网易开服测试的!
  站在版署那边的是臭名卓著的9C,当我看到9C的微姐出来“不希望看到闹到这一步”,还谈什么“对魔兽玩家的感情”,我昨天的宵夜全吐了!
  我我我我我,,,KAO,,我再靠,我TM还靠!!!你对玩家的感情??你的服务器烂到什么地步?我相信从05年4月走来的每一个玩家,都有话要说!9C的三季度财报净利润比去年同期下降92%,失去魔兽世界的9C几近成为一个空壳的公司,我相信这也是你们四年来没有善待玩家的报应!
  女人就是女人,总是感性从事,我想到抗战期间宋美龄把极为紧张的作战飞机调过来,到日本去撒温情传单,让日本女人规劝自己丈夫儿子别再参战,真好笑!难道就不知道日本女人积极参加“女子挺身队”,做慰安妇都感到光荣吗?真是妇人之见!
  我相信,乐于看到网易倒霉的还有国内其他同行,他们天真的认为一旦魔兽停服,那批巨量玩家会更换场地,也许会登陆他们的服务器!可是他们错的离谱,长期的魔兽世界玩家早已口味高尚了,哪怕闲的“贾君鹏,你妈妈喊你回家吃饭”,哪怕无聊到“哥哥回的不是贴,是寂寞”,也不会上你的服务器!就好比一个少女深爱自己多才多金潇洒盖世的男友,男友走了,她哪怕去追着他,也不会转而嫁给一个可笑而狼狈的猥亵男!
  应该说,这场权力角逐,版署处在一个尴尬的地位,舆论和风向都对他们不利,而9C除了举报把事端闹的更大,阻止网易盈利之外,他们已经无能为力,他们只能眼睁睁看着事态的发展。一旦被中编办确定为越权,那么版署的威风将一扫而尽,同时9C的脸上被狠狠掴了一巴掌!
  网易上有文化部力挺,下有广大玩家威慑,中间有媒体和专家的舆论导向,所以网易索性甩开版署单干起来,至于最后鹿死谁手,只能等待国务院中编办的文件态度。
  但我更倾向于版署会成为最后的输家,道理很简单,版署在没有任何理由支持的情况下,故意刁难!世界上没有无缘无故的爱,也没有无缘无故的恨,版署冒这么大的风险,千方百计阻止网易开张,一定有自己强大的理由支持!为什么魔兽世界在9C手里一切合法,到了网易手里就成了违规运营呢?
  闹到最后,500万玩家如果行动起来,万一版署被揪出几个腐败分子,那游戏就更好玩了!不要轻易低估500万玩家的力量,不要以为玩家都是青葱无聊的待业青年,玩家里什么样的知识结构职业分布年龄层次的都有,别忘记南京的局长周久耕是被谁办掉的??网友人肉搜索!
  版署的相关人物的所有财产如果被从事金融、地产的玩家人肉调查搜索,最后得出收入和资产严重不符,巨额财产来源不明,那对不起,有人要向我党好好交代交代了!
  谁来维护玩家的利益?
  玩家没有任何犯错,老老实实花钱,老老实实消费,却被权力机构和利益集团当成角力的筹码和被无视的存在肆意玩弄!天理何在?
  我一直强调:玩游戏是成年人性价比最高的娱乐,难道要我们要效仿其他成年人的爱好才算健康的爱好吗??去酒店大吃大喝烂醉如泥?去麻将桌废寝忘食?去歌厅桑拿找小姐乱搞两性关系?哪样花费不是玩游戏的几十上百倍?哪样对身体和工作的摧残不比玩游戏更厉害?
  如果版署强行关闭服务器,那么500万玩家账号上剩余的点卡,500万玩家的虚拟财产,500万玩家4年多付出的感情和精力,是一个多么巨额的赔偿?网易承担不起,我相信,版署也担当不起!
  魔兽世界没有违背我国法律,更没有反党反社会,没有色情谈不上暴力,一切都在四年前版署的认可下从容着陆,玩家快乐地消费着,凭什么四年后的今天,版署又出来横加阻挠?
  如果说内容不健康,四年前凭什么通过审批?
  如果说内容很健康,今天凭什么阻挠顺产?
  找不到任何支持的理由!都是版署在自找难堪!
  起码现在,玩家是不折不扣的弱者和最终的受害者,付了钱却可能享受不到服务,这种粗暴行径和索马里海盗没什么两样,只不过掠夺形式不同罢了!
  我们只想简单的玩游戏,我们从不主动招惹谁,我们是守法的公民,我们是认真的从业者,我们坚定的热爱祖国同时也热爱我们的亲人朋友!
  可“为什么受伤的总是我?”为什么我们不能向美国台湾公民哪样,踏踏实实享受自己必然的权利?
  魔兽世界的遭遇,折射出什么?
  在北美和欧洲,玩家早已在翘首等待《大灾变》新世界资料片的到来,在台湾,玩家们早已把巫妖王阿尔萨斯踩在脚下,穿着璀璨而傲人的T8装潇洒而过,而大陆玩家呢?每天还在撅着屁股跑到黑暗神殿看望伊利丹!~
  难道大陆玩家就低人一等?必须是人家玩剩下的,我们才有权尝试?
  说起来很可笑,可这样的事就是在大陆实实在在地发生了,折射出什么??
  首先,折射出权利机构的滥用和管理规则的真空,本来对于早已上市四年早已出版的版物,版署已经没有权利再行监管,他们的权力仅仅在于前置审批,可版署却强行插手,理由很简单:魔兽世界游戏是一块诱人的蛋糕!谁不想拥有美味蛋糕的所有权?
  魔兽世界在中国的遭遇,折射出中国管理机构的扯皮和浮躁,根本没有深入了解就断然和谐整改,搞的大陆玩家在被和谐的游戏里看到一个又一个任何物品和技能变成了箱子和包裹!
  打着关心青少年成长的借口,肆意百般阻挠健康的文化活动,可难道美国政府不关心青少年成长?日本政府不关心青少年成长?台湾政府不关心青少年成长?我们无可争辩的事实是:我们的青少年道德品质教育效果落后于美国、日本和台湾!如果你需要证据,我可以一口气给你举出100个,直到你听的发腻为止!
  魔兽世界在大陆的艰难遭遇,折射出网游市场竞争行为缀待规范,企业之间恶性诽谤,无序竞争,利益集团之间的角力,最后都会伤害到消费者!
  魔兽之路艰难,甚至折射出两种文化背景,两种意识形态、两种世界观和价值观的差异!玩家们已经和世界脚步的潮流共振,年轻的新生代已经和发达国家的新生代拥有同样的爱好,追求、审美和价值观,可我们的监管部门,仍然远远落后于时代的进步!他们秃了头败了顶的脑袋还在琢磨着为什么孩子们越来越不听话?!
  魔兽世界终将回来,我一点都不怀疑!暂时性的挫折无法阻挠一个勃勃生机的事物的成长!
  在未来若年之后,我们回想起魔兽世界区区一款游戏在中国大陆的种种磨难,好像刚刚改革开放时我们对港台所谓的“靡靡之音”拒绝接受一样!就好像我们感觉文革时人们的种种思想禁锢一样好笑!
  当然,我们还会记得,有版署这样可笑的机构,在阻挠一款小小游戏的登录!
  谁能阻止魔兽世界登录中国大陆?

透明的activity:
AndroidManifest.xml中找到要弹出的activity,加入theme:
android:theme=”@style/translucent”
res/values文件夹下建立styles.xml:






再新建colors.xml:
前2位:透明度00完全透明,99不透明
后6位:颜色

*有时候需要重启一下emulator,才会显示出透明颜色



#60000000

效果:
translucent

代码:
translucent

Toast:
效果:
toast

代码:
testToast

自定义view:
新建一个包com.view:

package com.view;

import com.test.R;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class InputMode extends RelativeLayout {

	public static String TAG = "InputMode";
	public TextView label;
	public EditText text;

	public InputMode(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public InputMode(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public InputMode(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public void initView() {
		Log.d(TAG, "initView()");
		this.label = (TextView) findViewById(R.id.input_mode_label);
		this.text = (EditText) findViewById(R.id.input_mode_text);
		this.text.getText();
	}

	/**
	 * 设置label文本
	 * @param str
	 */
	public void setLabelText(String str) {
		this.label.setText(str);
	}

	/**
	 * 设置输入框内容
	 * @param str
	 */
	public void setInputText(String str) {
		this.text.setText(str);
	}

	/**
	 * 设置输入框显示为密码
	 * @param flag
	 */
	public void setInputTextMode(boolean flag) {
		if(flag) {
			this.text.setTransformationMethod(android.text.method.PasswordTransformationMethod.getInstance());
		} else {
			this.text.setTransformationMethod(null);
		}
	}

	/**
	 * 获得输入框内容
	 * @return
	 */
	public String getInputText() {
		return this.text.getText().toString();
	}

	/**
	 * 设置label宽度
	 * @param width
	 */
	public void setLabelWidth(Integer width) {
		this.label.setWidth(width);
	}
}

之后新建一个layout:




	
	

调用:
在要加入自定义view的layout中:

	

activity中:

        InputMode username_im;
        username_im = (InputMode) findViewById(R.id.username_input);
        username_im.initView();
        username_im.setLabelText("Username:");
        username_im.setInputText("");

效果:
custom_view

代码:
customView

找了很久的东西,今天终于搞定了

     //隐藏软键盘
     ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

     //显示软键盘,控件ID可以是EditText,TextView,android 1.6的SDK本身有问题,无法设置manifest文件或者直接show出软键盘,preformclick也不行,必须手动click一个控件
     ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0);