安卓学习中遇到的问题及经验小记

安卓学习经验总结




 1 click  与Onclick(); 的使用


2 val() 是一个方法,用于设置?


3  查看下面文档,关注点为里面的jQuery 代码调用等涉及到的基础规则问题  ?
http://blog.csdn.net/dyllove98/article/details/9199599


4  栈的特点是 :先进先出  当前活动的Activity 位于栈顶


5 Service 与activity 的地位是并列的,他也代表了一个单独的Android组件。Service 与Activity 的区别在于:Service 通常为与后太运行,它一般不需要与用户


交互,因此service 组件没有图形用户界面


6 与activity 组件需要继承activity 基类类似,service 组件需要继承service基类。一个service组件被运行起来之后,他将拥有自己独立的生命周期,service组件


通常用于为其他组件提供后台服务后监控其它组件的运行状态。


7 broadcastReceiver 非常类似于事件编程中的监听器。与普通事件监听器不同的是,普通事件监听器监听得到事件源是程序中的对象;而BroadcastReceiver监听


的事件源是Android 应用中的其它组件。


8 intent 和intentFilter


intent 并不是Android 应用的组件,但它对于Android应用的作用非常大——它是Android应用内不同组件之间通信的载体。当Android 运行是需要连接不同的


组件时,通常就需要借助于intent 来实现。intent 可以启动应用中另一个activity,也可以启动一个service 组件,还可以发送一条广播消息来触发系统中的


BroadReceiver. 也就是说,activity、service、BroadcastReceiver 三种组件之间的通信都以Intent 作为载体,只是不同组件使用intent 的机制略有区别而已


9 如果程序运行没有显示错误,但是直接挂掉,怎么办?


直接关掉eclipse和模拟器,重新启动软件


10 如何反复遍历数组中的元素,既能每个元素都能访问到,而且不出此范围?
经验发现来源:
int currentImageId=0;
int[] images=new int[]{
R.drawable.flowerf12,R.drawable.flowerf13,R.drawable.flowerf14,R.drawable.flowerf15,
R.drawable.flowerf16,R.drawable.flowerf17,R.drawable.flowerf3,R.drawable.flowerf4,
R.drawable.flowerf5,R.drawable.flowerf6,R.drawable.flowerf7,R.drawable.flowerf8
};


iv.setImageResource(images[currentImageId++%images.length]);

注意这里的 images[currentImageId++%images.length]




11 如何获取屏幕的大小?


//获取窗口管理器
WindowManager widManager=getWindowManager();
Display display=widManager.getDefaultDisplay();
DisplayMetrics metrics=new DisplayMetrics();
//获取屏幕宽和高
display.getMetrics(metrics);
12 如何全屏显示?


//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


13 如何去掉窗口标题?


//去掉窗口标题


requestWindowFeature(Window.FEATURE_NO_TITLE);


14 如何实现点击一个按钮时,更改屏幕的方向?



button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Configuration configuration=getResources().getConfiguration();
if (configuration.orientation==Configuration.ORIENTATION_LANDSCAPE) {
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if (configuration.orientation==Configuration.ORIENTATION_PORTRAIT) {
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
});


15 如何创建一个定时器,从0开始,每隔1000毫秒完成一件事?


new Timer().schedule(new TimerTask() {

@Override
public void run() {

handler.sendEmptyMessage(0x112);
}
},0, 1000);


Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==0x112) {
//需要处理的内容
}
};
};




16 如何获取手机中sd卡上的"DCIM"文件?


File dir=Environment.getExternalStorageDirectory();//获取sd卡的路径


File imgdir=new File(dir, "DCIM");// 获取sd卡上DCIM文件


File[] imgs=imgdir.listFiles();   //将DCIM文件夹中的所有文件进行列举放入一个数组中


17 如何创建 并开启一个异步任务?


AsyncTask  task=new AsyncTask();//创建一个异步任务,而因为多数情况下,需要自定义AsyncTask,所以会用它的子类,重写一些方法
//class ImageAsynctask extends AsyncTask<Integer, Integer, Object>{

protected Bitmap doInBackground(Integer... params) {}
protected void onPreExecute(){}
protected void onPostExecute(Object result){}

}
// ImageAsyncTask task=new ImageAsyncTask();


task.execute();


18 如何自定义一个view组件? (以自定义一个ImageView组件为例)
方法:定义一个Java类,继承要自定义的组件类型,重写其中的一些方法,对原组件扩展


public class ImageAsyncView extends ImageView{

protected void onDraw(Canvas canvas){ }
}
19 如何更改listview的间隔条宽度,颜色?


android:divider="#f00"  <!--  divider设定间隔条的颜色-->


android:dividerHeight="8px"   <!--  dividerHeight设定间隔条的宽度-->


20 如果listview中,每个列表项的内容只有几个文字,如何用最简单的方法设定(不需要写适配器)?


    方法:在activity的布局文件中写入这个,在Java代码中则不必做其他的任何处理

<ListView 
   android:id="@id/lvarray"
   android:layout_width="match_parent"
   android:layout_height="match_parent"


   android:entries="@array/books"   //因为这个,所以需要在res/values/中创建一个数组资源文件arrays即如下
</ListView>

res/values/arrays文件中


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>疯狂Java讲义</item>
        <item>疯狂Ajax讲义</item>
        <item>疯狂Android讲义</item>
        <item>疯狂xml讲义</item>
        <item>疯狂web讲义</item>
    </string-array>
    
</resources>

21 创建listView的几种方式:

     (1)在布局文件中放置一个listView组件

      (2)让activity 继承listActivity(相当于该activity显示的组件为ListView)。listactivity 里面包含了一个listView。
22 如何为listview填充数据


(1)不使用适配器(填充器)

直接在listview中添加一个entries属性,并为其设置。该值以资源文件的形式设置。 在res/values/arrays中定义

例如 
    <ListView 
    android:id="@id/lvarray"
  android:layout_width="match_parent"
  android:layout_height="match_parent"


   android:entries="@array/books"   //因为这个,所以需要在res/values/中创建一个数组资源文件arrays即如下
     </ListView>

res/values/arrays文件中


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>疯狂Java讲义</item>
        <item>疯狂Ajax讲义</item>
        <item>疯狂Android讲义</item>
        <item>疯狂xml讲义</item>
        <item>疯狂web讲义</item>
    </string-array>
    
</resources>



(2)使用适配器:总体思路,获得lv控件——创建一个adapter对象——lv.setAdapter(适配器);


(1) ArrayAdapter:   arrayAdapter有几个重载的构造函数,注意参数变化

ArrayAdapter<String> ada=new ArrayAdapter<String>(ListActivity.this, R.layout.list_item,R.id.tv, names);

参数为上下文  列表项布局文件   数组资源放的组件(控件)  数组资源

(2) SimpleAdapter:   也有几个不同的构造函数


ListView lv=(ListView) this.findViewById(R.id.lv);


List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();

initData();


SimpleAdapter sada=new SimpleAdapter(this, //布局文件资源
data, //数据资源
R.layout.list_item,  //列表项布局
new String[]{"icon","title","content","beizhu"},  //数据的关键字形成的数组
new int[]{R.id.ivicon,R.id.title1,R.id.content,R.id.iv2});  //数据的关键字所对应的列表项布局资源id形成的数组
lv.setAdapter(sada);


private void initData() {
Map<String, Object> item1=new HashMap<String, Object>();
item1.put("icon",R.drawable.img01);
item1.put("title", "标题一");
item1.put("content", "内容部分一");
item1.put("beizhu", R.drawable.img02 );
data.add(item1);

Map<String, Object> item2=new HashMap<String, Object>();
item2.put("icon", R.drawable.img03);
item2.put("title", "标题二");
item2.put("content", "内容部分二");
item2.put("beizhu", R.drawable.img04 );
data.add(item2);

}
(3)可扩展baseAdapter: 需要新创建一个内部类,继承BaseAdapter,并重写其中的方法.(这里的)


ListView lv=(ListView) this.findViewById(R.id.lv);  //找到控件lv


List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();  //定义一个list集合对象里面存储map类型的对象,方便扩展

initData();


BaseAdapter bada=new BaseAdapter() {

@Override
public View getView(int position, View convertView, ViewGroup parent) {     //为单个的列表项视图填充数据

if (data!=null) {
Map<String, Object> item=(Map<String, Object>) getItem(position);
if (item!=null) {
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
LinearLayout layout=(LinearLayout) inflater.inflate(R.layout.list_item, null);//注意控件要通过该布局layout找到
ImageView iv=(ImageView) layout.findViewById(R.id.iv);
iv.setImageResource((Integer) item.get("icon"));     //绑定具体数据
TextView tv=(TextView) layout.findViewById(R.id.tv);
tv.setText(item.get("text").toString());
return layout;
}

}
return null;
}

@Override
public long getItemId(int position) {     //获得列表项的编号

return position;
}

@Override
public Object getItem(int position) {     //获取列表项中的数据
Map<String, Object> item=data.get(position);

return item;
}

@Override
public int getCount() {    //列表项的个数  

return data.size();
}
};

lv.setAdapter(bada);               //为lv绑定适配器


扩展:  可展开的列表项组件ExpandAbleListView  (这个用于制作二级菜单,是在baseAdapter的基础上进行的。是baseAdapter的嵌套。)


就是每个列表项,对应的内容还是个列表。因此在进行数据的适配时稍显麻烦,细节性问题较多,急需注意。下面附一个例子做参考。


布局文件:
activity_main.xml:   <ExpandableListView
        android:id="@id/elv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />


list_item.xml: <ImageView 
        android:id="@id/iv"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:padding="10dp"/>
    <TextView 
        android:id="@id/tv1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:textSize="30dp"/>

list_item2.xml: <TextView 
        android:id="@id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="24dp"
        android:layout_marginLeft="60pt"/>
代码文件:
int[] logos=new int[]{
R.drawable.img08,
R.drawable.img09,
R.drawable.img10,

};
private String[] names=new String[]{"神族兵战","虫族兵战","人族兵战"};
private String[][] args=new String[][]{
{"狂战士","龙骑士","黑暗圣堂","电兵","虎斗士"},
{"小狗","狸猫","飞龙"},
{"机枪兵","神弹兵","护士mm","大炮筒"}
};


elv=(ExpandableListView) this.findViewById(R.id.elv);
        ExpandableListAdapter elada=new ExpandableListAdapter() {

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {


}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
  

}

@Override
public void onGroupExpanded(int groupPosition) {
  

}
@Override
public void onGroupCollapsed(int groupPosition) {
  

}
@Override
public boolean isEmpty() {
  
return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
  
return false;
}
@Override
public boolean hasStableIds() {
  
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (logos.length!=0) {
LayoutInflater flater=LayoutInflater.from(MainActivity.this);
LinearLayout layout=(LinearLayout) flater.inflate(R.layout.list_item1, null);
ImageView iv1=(ImageView) layout.findViewById(R.id.iv);
iv1.setImageResource(logos[groupPosition]);
TextView tv1=(TextView) layout.findViewById(R.id.tv1);
tv1.setText(names[groupPosition]);
return layout;
}  
return null;
}
@Override
public long getGroupId(int groupPosition) {
  
return groupPosition;
}
@Override
public int getGroupCount() {
  
return logos.length;
}
@Override
public Object getGroup(int groupPosition) {
  
return null;
}
@Override
public long getCombinedGroupId(long groupId) {
  
return 0;
}
@Override
public long getCombinedChildId(long groupId, long childId) {
  
return 0;
}
@Override
public int getChildrenCount(int groupPosition) {
  
return args.length;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if (args.length!=0) {
LayoutInflater flater=LayoutInflater.from(MainActivity.this);
LinearLayout layout=(LinearLayout) flater.inflate(R.layout.list_item2, null);
TextView tv=(TextView) layout.findViewById(R.id.tv2);
tv.setText((CharSequence) getChild(groupPosition, childPosition));
return layout;
}  
return null;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
  
return childPosition;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
  
return args[groupPosition][childPosition];
}
@Override
public boolean areAllItemsEnabled() {
  
return false;
}
};

elv.setAdapter(elada);
    }




23 ListView扩展性的东西: AutoCompleteTextView(自动完成补全功能)  MultiAutoCompleteTextView   GridView   StackView   AdapterViewFlipper


(1)AutoCompleteTextView以及它的扩展  MultiAutoCompleteTextView   下面例子中同时呈现了两个扩展性的控件





布局文件
<AutoCompleteTextView 
        android:id="@id/actv"
               android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionHint="请选择您喜欢的图书"
        android:dropDownHorizontalOffset="10dp"
        android:completionThreshold="1"/>


<MultiAutoCompleteTextView 
        android:id="@id/mauto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionThreshold="1"/>

关键性代码:


String[] books={
"疯狂Java讲义",
"疯狂Android讲义",
"疯狂xml讲义",
"疯狂workflow讲义"
};


AutoCompleteTextView actv=(AutoCompleteTextView) this.findViewById(R.id.actv);
MultiAutoCompleteTextView mactv=(MultiAutoCompleteTextView) this.findViewById(R.id.mauto);


ArrayAdapter<String> ada=new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,books);


actv.setAdapter(ada);
mactv.setAdapter(ada);
mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());


(2)GridView:


布局文件:
activity_main.xml:<GridView 
    android:id="@id/gridview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:horizontalSpacing="1pt"
    android:verticalSpacing="1pt"
    android:numColumns="4"
    android:gravity="center">
   
     </GridView>


cell.xml: <ImageView 
        android:id="@id/liiv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
代码文件:


int[] images=new int[]{
R.drawable.img01,R.drawable.img02,R.drawable.img03,
R.drawable.img04,R.drawable.img05,R.drawable.img10,
R.drawable.img11,R.drawable.img13,R.drawable.img12,
R.drawable.img14,R.drawable.img09,R.drawable.img12,
};




grview=(GridView) this.findViewById(R.id.gridview);
        iv=(ImageView) this.findViewById(R.id.iv);
        
        List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
        for (int i = 0; i < images.length; i++) {
Map<String, Object> listitem=new HashMap<String, Object>();
listitem.put("icon", images[i]);
data.add(listitem);
}
        SimpleAdapter sada=new SimpleAdapter(this, //上下文
        data,                 //数据源
        R.layout.cell,        //列表项布局文件
        new String[]{"icon"},   //数据源中的关键字组成的数组
        new int[]{R.id.iv});    //关键字对应资源的具体存放控件id组成的数组
        
        grview.setAdapter(sada);
        
        grview.setOnItemSelectedListener(new OnItemSelectedListener(
        ) {


@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
iv.setImageResource(images[position]);
}


@Override
public void onNothingSelected(AdapterView<?> arg0) {


}
});
        grview.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {

iv.setImageResource(images[position]);
}
});
     


(3) StackView:   层叠在一起的


布局文件;
activity_main.xml: <StackView 
      android:id="@id/mStackView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:loopViews="true">
      
  </StackView>
cell.xml: 
<ImageView 
        android:id="@id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


代码文件:
int[] images=new int[]{
R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,
R.drawable.img13,R.drawable.img12,R.drawable.img11,R.drawable.img10
};
StackView sv=(StackView) this.findViewById(R.id.mStackView);
List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
        for (int i = 0; i < images.length; i++) {
Map<String, Object> item=new HashMap<String, Object>();
item.put("icon", images[i]);
data.add(item);
}
        SimpleAdapter sada=new SimpleAdapter(this, //上下文
        data,                 //数据源
        R.layout.cell,        //列表项布局文件
        new String[]{"icon"},   //数据源中的关键字组成的数组
        new int[]{R.id.iv});    //关键字对应资源的具体存放控件id组成的数组
        sv.setAdapter(sada);
   
(4) AdapterViewFlipper:


布局文件:
<AdapterViewFlipper
        android:id="@id/flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:flipInterval="3000"
        android:layout_alignParentTop="true"/>
代码文件:




int[] images=new int[]{
R.drawable.img01,R.drawable.imgl1,R.drawable.imgl10,R.drawable.imgl11,
R.drawable.imgl12,R.drawable.imgl13,R.drawable.imgl2,R.drawable.imgl3,
R.drawable.imgl4,R.drawable.imgl5,R.drawable.imgl6,R.drawable.imgl7,
R.drawable.imgl8,R.drawable.imgl9,R.drawable.imgl10,R.drawable.imgl5
};
AdapterViewFlipper   avf=(AdapterViewFlipper) this.findViewById(R.id.flipper);
BaseAdapter bada=new BaseAdapter() {

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建Imageview
ImageView imageView=new ImageView(MainActivity.this);
//加载图片资源
imageView.setImageResource(images[position]);
//设置imageview的类型适配方式
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
//设置imageview的布局适配方式
imageView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
return imageView;
}

@Override
public long getItemId(int position) {

return position;
}

@Override
public Object getItem(int position) {

return position;
}

@Override
public int getCount() {

return images.length;
}
};
avf.setAdapter(bada);
        






















/


 1、 intent 的用法:


Intent 意图相关知识


intent 有两种打开方式,显式意图和隐式意图

intent 与intent-filter   intent 可以看作招聘单位的招聘要求,intent-filter 可以看作是应聘者的简历


应聘者intent中 intent-filter中最常用的属性是  action 和category  


而招聘单位通过发布要求 setAction ()  和 addCategory() 进行招聘,招聘单位的setaction() 要求应聘者intent只需满足一个即可,但是


addCategory()可以有多个,而且addCategory()必须全部满足


自定义的intent-filter 必须加入默认的<category android:name="android.intent.category.DEFAULT" />
(可以当做应聘者默认情况下必须是个人)


intent的另一个属性componentName 属性,是基础,一般用对它进行过包装的方法


举例代码:
公司要求 :  
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:   //方法一和方法二一致,方法二是方法一的包装
ComponentName component=new ComponentName(this, SecondActivity.class);
Intent intent=new Intent();
intent.setComponent(component);
this.startActivity(intent);
break;
case R.id.btn2:
Intent intent2=new Intent(this, SecondActivity.class);
startActivity(intent2);
break;
case R.id.btn3:    //action只要intent-filter中有一个匹配即可,category必须全部匹配
              //从结构上看,action 是set方法,即便多设置,后者会覆盖前者,但action是
  //add方法,可以增加
Intent intent3=new Intent();
intent3.setAction("programer1");
intent3.addCategory("c01");
intent3.addCategory("c02");
intent3.addCategory("c03");
intent3.addCategory("c04");
this.startActivity(intent3);
break;
}

}




应聘者:
清单文件中配置的信息,可以看作应聘者的简历
<activity
            android:name=".SecondActivity"
            android:label="@string/title_activity_second">
           <intent-filter>
               <action android:name="programer1"/>
               <action android:name="programer2"/>
               <action android:name="programer3"/>
               <category android:name="c01"/>
               <category android:name="c02"/>
               <category android:name="c03"/>
               <category android:name="c04"/>

           </intent-filter>
        </activity>




2、 如何创建一个碎片 或者片段  fragment?


思路: 
1、创建一个Fragment的子类,即创建一个类,继承自Fragment


2、重写需要的方法,onCreate() onCreateView() 等相关方法,当然也可以创建构造函数,供外界使用


例如:(此例中只是根据需要重写了一个方法 imgid是根据项目实例加上的,可以没有的)
public class DetailFragment extends Fragment{
int imgid;
MainActivity activity;
public DetailFragment() {

}
public DetailFragment(int imgid){
this.imgid=imgid;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//找到详细信息的布局文件
View view=inflater.inflate(R.layout.fragment_detail, null);

ImageView iv=(ImageView) view.findViewById(R.id.tv);
iv.setBackgroundResource(imgid);
return view;//返回碎片的布局视图
}
}


3、如何使用或者引用创建的碎片?

//下面连续写的好处,代码少,不用导很多包
//fragmentmanager
//fragmenttransaction
//begintransaction
//add/replace
//commit
this.getFragmentManager()
.beginTransaction()
.add(R.id.content,new DetailFragment(imgid), "detail")
.commit();

注:这里使用的new DetailFragment(imgid),使用的是这个碎片文件,


public class DetailFragment extends Fragment{
int imgid;
MainActivity activity;
public DetailFragment() {

}
public DetailFragment(int imgid){
this.imgid=imgid;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//找到详细信息的布局文件
View view=inflater.inflate(R.layout.fragment_detail, null);

ImageView iv=(ImageView) view.findViewById(R.id.tv);
iv.setBackgroundResource(imgid);
return view;//返回碎片的布局视图
}
}




4、如何按照横屏 竖屏两种不同方式设置具体的布局文件:


思路:

1、根据某些标志判断出横屏和竖屏;


2、根据横屏和竖屏的不同布局方式进行布局


例子:此处附加一个根据横竖屏设置不同布局,并且布局中需要使用不同的碎片的项目实例,


该实例实现了,


竖屏时,主界面显示一个列表,点击列表项,可以看到内容详情(内容详情显示在一个新的activity)


横屏时,屏幕较大,左边显示列表项,右边显示点击列表项看到的详情页

无论横屏还是竖屏,这里的内容详情部分都是动态加载的碎片(就是在内容详情所在的activity中创建使用一个碎片fragment)


因为碎片一定是activity的一部分,所以必须把fragment加载入一个activity中



项目实现思路: 因为横竖屏时,界面含有的小组件不同,可以应用判断是否含有某个id值来区分横竖屏


设置两个activity    MainActivity    DetailActivity ,一个fragment,DetailFragment 


四个布局文件  activity_detail.xml  activity_main_land.xml  activity_main.xml   fragment_detail.xml


在res目录下,创建一个values-land(这个表示横屏时的布局)文件夹,文件夹中创建一个refs.xml(这个名称必须这样命名)的文件

refs.xml:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="layout"  name="activity_main">@layout/activity_main_land</item>
</resources>


activity_main.xml:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >


    <ListView
        android:id="@id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/item_books"
        android:background="@color/list_bg"/>


</RelativeLayout>



activity_main_land.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:baselineAligned="false" >
    <ListView 
        android:id="@id/lv"
        android:layout_width="200dp"
        android:layout_height="match_parent"
      android:entries="@array/item_books"
      android:background="@color/list_bg">
        
    </ListView>
    <FrameLayout 
        android:id="@id/content"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
        
    </FrameLayout>


</LinearLayout>




activity_detail.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" 
    android:id="@id/root">


</RelativeLayout>



fragment_detail.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:gravity="center">
    
    <ImageView 
        android:id="@id/tv"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</LinearLayout>




MainActivity.java:


public class MainActivity extends Activity implements OnItemClickListener{
ListView lv;
int imgid;
int[] imgs={R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,R.drawable.imgs014,R.drawable
.imgs015,R.drawable.imgs016};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) this.findViewById(R.id.lv);
lv.setOnItemClickListener(this);

}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
this.imgid=this.imgs[position];

//此处通过判断是否含有某个可以作为身份标识的id判断屏幕是横屏还是竖屏(技巧)
//动态加载碎片fragment
//横屏 可以直接在该activity的(布局中)存放碎片的父容器动态加载碎片
if (this.findViewById(R.id.content)!=null) {
//下面连续写的好处,代码少,不用导很多包
//fragmentmanager
//fragmenttransaction
//begintransaction
//add/replace
//commit
this.getFragmentManager()
.beginTransaction()
.add(R.id.content,new DetailFragment(imgid), "detail")
.commit();
}else { //竖屏  竖屏时,是两个activity,所以用intent启动activity的方式打开
//在新的详情界面activity中动态加载碎片,传递的参数可以通过intent传递
Intent intent=new Intent(this,DetailActivity.class);
intent.putExtra("img", imgid);
this.startActivity(intent);
}

}
}


DetailActivity.java:


public class DetailActivity extends Activity {
int imgid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
//获取传递的参数,图片id
imgid=getIntent().getIntExtra("img", -1);
//详情界面    动态加载fragment 片段
this.getFragmentManager()
.beginTransaction()
.add(R.id.root,new DetailFragment(imgid), "detail")
.commit();//add()方法中三个参数分别表示fragment存放容器,fragment ,一般的标识参数
}
}
DetailFragment.java:


public class DetailFragment extends Fragment{
int imgid;
MainActivity activity;
public DetailFragment() {

}
public DetailFragment(int imgid){
this.imgid=imgid;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//找到详细信息的布局文件


View view=inflater.inflate(R.layout.fragment_detail, null);

ImageView iv=(ImageView) view.findViewById(R.id.tv);
iv.setBackgroundResource(imgid);
return view;//返回碎片的布局视图
}

}


5、 图片放上去之后无法铺满?


将图片以背景Background()的方法设置上去,


6 background 设置图片与src设置图片的区别?


background 会拉伸图片,以铺满整个容器


src 不会自动拉伸,如果设置某个方向铺满,则图片可能会按照一定的比例进行缩放,可能出现白边的现象


7 adpaterViewFlipper  在利用baseAdapter 进行设置图片时,


public View getView(int position, View convertView, ViewGroup parent) {


//这里的MainActivity.this 进行设置时,指的是当前adpaterViewFlipper 所在的activity的映射
ImageView iv=new ImageView(MainActivity.this);

iv.setImageResource(imgs[position]);


//设置方式是水平垂直适合
iv.setScaleType(ImageView.ScaleType.FIT_XY);
//设置imageview的布局适配方式  适应父容器
iv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
return iv;

}




8 设置轮播图的方式有哪些?


     (1)使用viewFlipper 




      (2) 使用adapterViewFlipper




      (3) 使用普通的图片控件 ImageView + 异步加载的方式




     (4)普通图片ImageView + 开发新线程












































































 

















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值