Android学习记录

1.根据图片名称,获取到图片资源

<span style="font-size:14px;">int id = context.getResources().getIdentifier(im, "drawable", context.getPackageName());  //im为图片名称(不含格式)
mListView.imageID.setImageDrawable(getResources().getDrawable(id));                      //获取到id之后可以加载出来</span>


2.textview太长无法显示

<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




未完待续。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值