1、在alertDialog中显示自定义布局,并使EditText显示输入法:
.getWindow().setContentView(layout)来加载layout。这是默认情况下隐藏软键盘的方法,要重新显示软键盘,要执行下面这段代码:
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
先后顺序:
1. AlertDialog dlg=new AlertDialog.Builder(mContex).create();
2. dlg.setView(layout) //setView()要在show()前面
3. dlg.show()
4. Window window = dlg.getWindow()
window.setContentView(R.id.layout)
5. window.finfViewById(R.id.***layout);//这里设置要显示的layout布局文件
在调用show方法前先调用dlg.setView(layout),
show后再调用window.setContentView(layout),
两个Layout布局应该是相同的。
至于原因,暂时不明,但是确实解决了问题,在EditText上点击,可以调出软键盘,输入法了。
例子:
AlertDialog dlg=new AlertDialog.Builder(mContex).create();
dlg.show();
//加上这一句就能显示小键盘了。。。重要重要
window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setContentView(R.layout.alert_singleline_input);//注意这里用的是R里面的id
TextView titleTextView = (TextView) window.findViewById(R.id.alert_input_title);
… …
2、常用dialog
Dialog,对话框,一个对话框就是一个小窗口,并不会填满整个屏幕,通常是以模态显示,要求用户必须采取行动才能继续进行剩下的操作。
Android提供了丰富的对话框支持,它提供了如下4中常用的对话框:
- AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。
- ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。
- DatePickerDialog:日期对话框。
- TimePickerDialog:时间对话框。
3、打开一个新的Activity
//=========在Activity中打开另一个Activity
1. startActivity(new Intent(mContext, MainActivity.class));
//=========在Fregment中打开另一个Activity
2. Intent intent = new Intent(getActivity(),CardActivity.class);
getActivity().startActivity(intent);
//========
3. startActivityForResult()
/*
NOTE:
1. 当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并根据T2Activity的setResult()方法调用前一个T1Activity中的onActivityResult( )方法。
2. 在Fragment中应该调用startActivityForResult()的方法
而不是getActivity().startActivityForResult()
*/
相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)
例子:
http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html
使用Intent传递参数:
//添加参数 (默认使用的也是Bundle,和第二种方式一样)
intent.putExtra("key","String");
intent.putExtra("String",xxxxx); //其中xxxxx需要实现Serializable接口;
//获取参数
intent.getExtras().getString("key"); //获取String类型的值
intent.getExtras().getXXXXX("key"); //获取XXXXX类型的值
intent.getExtras().get("key"); //获取Object类型的值,此时需要进行强制转换
//添加Bundle
Bundle bundle=new Bundle();
bundle.putXXX("String",XXXX);
intent.putExtras(bundle);
//获取Bundle
Bundle bundle = this.getIntent().getExtras();
XXX = bundle.getXXX("String");
6、SharedPreference:
将数据保存至SharedPreferences:
SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Editor editor=preferences.edit();
String name="xixi";
String age="22";
editor.putString("name", name);
editor.putString("age", age);
editor.commit();
从SharedPreferences获取数据:
SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
String name=preferences.getString("name", "defaultname");
String age=preferences.getString("age", "0");
haredPreferences的四种操作模式:
- Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
- Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
- Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
- MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
- MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
7、自定义控件提示Use View.isInEditMode() in your custom views to skip code when shown in Eclipse。
我们直接找到“自定义控件”的代码,然后 解决方法是定位触发错误代码段,并将造成此错误的代码行用
if(!isInEditMode()){
//造成错误的代码段
}
包起来,这样在Eclipse中显示时将跳过此代码段而不再出现错误。这样就可以正常预览layout了。
8、Json的null
在Map中取不存在的键值对时不会报异常,只会返回null;
利用jSONObject.get(Object key)方法及get(String key)取不存在的键值对时不会报异常,会返回null;
但是利用jSONObject.getxxx(String key)方法取时会报空指针异常
第一种情况是: json包是json-lib包是net.sf.json
怎样判断JSONObject返回的是字符串null还是null值.
研究源码发现.JSONObject里有一段代码是当遇到json串中是null的时候.返回JSONNUll.第二种情况是: org.json的包。这时候发现.返回的null是JSONObject.NUll
两种包不一样的返回NUll值
9、在Adapter里面调用Activity的方法/变量
把activity或者fragment的实例传入adapter中,然后就可以调用activity或者fragment里面的方法。
场景:为listview中的item添加适配器,达到自定义item的效果。当点击item中的时候调用Activity的方法,比如打开另一个Activity。
解决:在Adapter中维持一个对该Activity或Fragment的引用。当实例化这个Adapter时,对其中的这个引用赋值。这样就可以根据需要调动Activity或者Fragment中的方法。
例如:
- Activity:
public class MyActivity extends Activity
{
public void test(){};
public void test(int position){}
}
- BaseAdater:
public class MyBaseAdapter extends BaseAdapter{
MyActivity context;
public MyBaseAdapter(MyActivity context){
this.context = context;
}
……
//调用MyActivity的方法。
context.test();
context.text(1);
……
}
http://www.android100.org/html/201306/30/3376.html
10、popupwindow
//加上上面两句,可以在触发Back键或者点击在popupWindow以外的区域时让其dismiss
pop.setOutsideTouchable(true);//======第一句
pop.setBackgroundDrawable(new BitmapDrawable());//=======第二句
11、long和int
此部分有待商议:int和long在不同位的操作系统和编译器分别代表多长的字节?
由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况:
主要以下几种转换方法,供参考:
1. 强制类型转换
long ll = 300000;
int ii = (int)ll;
2. 调用intValue()方法
long ll = 300000;
int ii= new Long(ll).intValue();
3. 先把long转换成字符串String,然后在转行成Integer
long ll = 300000;
int ii = Integer.parseInt(String.valueOf(ll));
这三种方法都比较简单明了。
12、javadoc生成
使用/***/注释,这种就会生成javadoc注释,可以在类名,方法名、字段名上方输入/**回车即可自动生成doc模版。
13、BaseAdapter的getView()调用时机
BaseAdapter的getView()方法的调用时机大致如下:
初始显示时
listview滚动时
notifyDataSetChanged处理时
每一个item都要调用一次getView();
14、textview中文字过长时,显示省略号
设置Textview的属性
android:ellipsize="middle" //此处还有其他值,分别在头部、中间、尾部显示
android:maxEms="15" //元素的最大树木
android:singleLine="true"
15、Parcelable、Serializable使用与区别
未完待续……
16、RelativeLayout布局的wrap_content 和 match_parent
RelativeLayout布局中,wrap_content 和 match_parent 有时是一样的。
比如,设置布局的最外层layout的 layout_height 或 layout_width ,设置为wrap_content 或 match_parent 都会填满整个布局,并不是真的“wrap_content”。
但是将RelativeLayout修改为LinearLayout,情况就会相反。
17、设置Dialog可以通过ApplicationContext开启
将Dialog设置为Alert类型即可。如果需要在App外弹出,则需要权限:
//alertDialog为Dialog的一个实例
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//或者在自定义的Dialog中,直接 getWindow().setType(…)……
18、设置Activity为全透明
在Manifest文件中注册的需要设置透明的Activity中,添加主题:
android:theme=”@android:style/Theme.Translucent.NoTitleBar.Fullscreen”
或
android:theme=”@android:style/Theme.Translucent.NoTitleBar”
同时保证该Avitivity是继承自Activity(或者自己创建的BaseActivity,没有过多限制Activity的主题),而不是其他的比如AppCompatActivity等。
**19、View inflate方法和LayoutInflater inflate方法的区别
参考:
http://www.cnblogs.com/baipengzhan/p/LayoutInflater_inflate_View_inflate.html
LayoutInflater类的inflate方法适用于所有需要进行布局填充的场景,是Android中专门进行布局填充的方法,Android中其他需要使用布局填充的地方,都会调用本方法,而不是View类中的inflate方法。该方法不是静态方法,需要先创建LayoutInflater类的对象才能调用。
View类中的inflate方法内部包裹了LayoutInflater类的inflate方法,这个方法是一个静态方法,不需要创建View类的对象,直接使用View类名调用,相比上一种方法是一种简便方法。但很明显,这个方法不如上一个方法功能强大。