1.根据图片名称,获取到图片资源
<span style="font-size:14px;">int id = context.getResources().getIdentifier(im, "drawable", context.getPackageName()); //im为图片名称(不含格式)
mListView.imageID.setImageDrawable(getResources().getDrawable(id)); //获取到id之后可以加载出来</span>
<span style="font-size:14px;">android:ellipsize="end" // 在文本后自动加上省略号
</span>
3.scaleType
<span style="font-size:14px;">scaleType="matrix" //保持原图大小,从左上角开始,以矩阵形式绘图
scaleType=“fitXY” //将原图横方向拉伸
scaleType=“fitStart” //将原图以左上角点按比例缩放
scaleType=“fitCenter” //将原图沿第一行居中的点按比例缩放
scaleType=“fitEnd” //下方第一行右边点
scaleType=“Center” //(保持原图大小)以原图和imageview为中心点,填满imageview,裁剪原图,以填满imageview为目标
scaleType=“centerCrop” //(不保持原图大小)同上
scaleType=“centerInside” //(不保持原图大小)同上,以显示完整图片为目标</span>
参见博客点击打开链接
4.隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题栏 需放在setContentView()之前执行
5.回收活动数据保存
//用于保存临时数据
@Override
protected void onSaveInstanceState(Bundle outstate) {
super.onSaveInstanceState(outstate);
String temp = "Something";
outstate.putString("tag", temp);
}
//在create中获取
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//InitTextView();
//InitImageView();
//InitViewPager();
if (savedInstanceState != null) {
String temp = savedInstanceState.getString("tag");
}
}
6.Activity的四种模式
android:launchMode=""
standard
默认启动模式。所有活动都会在一个栈中进行,会重复创建新活动 A->B->A->B
singleTop
当栈顶活动即为要创建的新活动时,不会再创建新活动。设置A为singleTop模式 A->B->A
singleTask
当栈顶活动不是要创建的新活动时,但是此时栈中存在这个活动,系统会将这个活动上面的所有活动出栈,让这个活动到栈顶。设置A为singleTask模式
singleInstance
A调用B,B调用C,B为singleinstance模式。这时候A、C在一个栈中,B在一个栈中,按返回键时,会从C直接返回到A,再返回时才为B
7.Activity技巧
一、显示当前活动
创建一个BaseActivity继承Activity,让项目中所有活动继承BaseActivity
在BaseActivity中修改onCreate
Log.d("BaseActivity", getClass().getSimpleName());
</pre><pre name="code" class="java">二、从任意活动退出程序
新建类为活动管理器
<pre name="code" class="java">public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity:activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
修改BAseActivity
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
proteceed void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
在项目交互的时候,方便写FirstActivity的人了解SecondActivity有哪些需要的变量,只需一行代码便可启动SecondActivity
例:FirstActivity启动SecondActivity
修改SecondActivity代码:
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
}
在FirstActivity中修改启动的事件:
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
8.自定义控件
以标题栏为例,先创建一个title.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back"
android:layout_gravity="center"
android:textColor="#fff"
android:layout_margin="5dp"
android:id="@+id/button_back" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="This is a Title!"
android:layout_weight="1"
android:layout_gravity="center"
android:textColor="#fff"
android:textSize="24sp"
android:id="@+id/textview" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Edit"
android:textColor="#fff"
android:id="@+id/button_edit" />
</LinearLayout>
在main函数的布局文件中引用布局:
<include layout="@layout/title" /> //注意需要把原有的标题栏给隐藏(参见4)
自定义控件(包括设置监听事件):
a)新建TitleLayout
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
Button titleBack = (Button)findViewById(R.id.button_back);
Button titleEdit = (Button)findViewById(R.id.button_edit);
titleBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((Activity)getBaseContext()).finish();
}
});
b)在main函数的布局文件中引用控件
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.uicustomviews.TitleLayout>
9.ListView的优化处理
通过缓存来优化加载过程
public class FruitAdapter extends ArrayAdapter<Fruit> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) { //布局缓存
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder(); //通过viewHolder来避免重复获取控件
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R,id,fruit_name);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
}
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
10.关于碎片的一些问题
①先碎片的xml,再在碎片的类中加载碎片
public class AnotherFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.another_fragment, container, false);
return view;
}
}
②动态加载碎片
AnotherFragment fragment = new AnotherFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null); //返回栈(让按back的时候可以返回上一个碎片)
transaction.commit();
③碎片、活动之间通信
活动获取碎片实例,通过实例调用方法
RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
碎片获取活动,通过活动调用方法
MainActivity activity = (MainActivity) getActivity();
碎片与碎片之间通信,需要碎片先获取活动,活动再获取另外一个碎片实例,即可以实现碎片与碎片之间通信
④动态加载布局技巧
例如layout-large/activity_main,layout-sw600dp/activity_main
未完待续。。。