码迷,mamicode.com
首页 > 移动开发 > 详细

[转]android学习----基础UI编程(六)

时间:2015-06-11 19:12:08      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

  •  相簿浏览 Gallery
  •  文件搜索引擎FileSearch

 

17. Gallery 与 衍生BaseAdapter 容器

    Gallery控件,即Android的图片库控件。

    需要定义一个BaseAdaper的子类(eg.ImageAdapter)来操作控制图片资源,然后在主类中通过Gallery.setAdapter(new ImageAdapter(this));来使用这个控制类。

 

示例代码

    本例中 ImageView 和 Gallery 控件相互协作 . 

① 新建项目

② 定义layout 外部resource 的xml 文件,用来改变layout 的背景

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Gallery>
        <attr name="android:galleryItemBackground/>
        <!-- 定义layout 外部resource 的xml 文件,用来改变layout 的背景图。-->

    </declare-styleable>

</resources>

 

③ 修改main.xml 布局,添加一个Gallery 和一个ImageView

<AbsoluteLayout ...>

<Gallery
    android:layout_width="fill_parent"
    android:layout_height="143px"
    android:layout_x="0px"
    android:layout_y="51px"
    android:id="@+id/Gallery_preView" 

   android:unselectedAlpha  设置选中的图片的透明度   

    android:spacing  setSpacing(int)  图片之间的空白大小 

    android:animationDuration   setAnimationDuration (int )

设置布局变化时动画的转换所需的时间(毫秒级)。仅在动画开始时计时。该值必须是整数,比如:100。 

>
</Gallery>
<ImageView
    android:layout_width="239px"
    android:layout_height="218px"
    android:layout_x="38px"
    android:layout_y="184px"
    android:id="@+id/ImageView_photo" >
</ImageView>

</AbsoluteLayout>

 

④ 新建一个myImageAdapter 类--Gallery 的适配器,它继承于BaseAdapter 类.

package zyf.Ex_Ctrl_10ME;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;


public class myImageAdapter extends BaseAdapter {
     @Override
     public int getCount() {
          // TODO Auto-generated method stub
          return 0;
     }

     @Override
     public Object getItem(int position) {
          // TODO Auto-generated method stub
          return null;
     }

     @Override
     public long getItemId(int position) {
          // TODO Auto-generated method stub
          return 0;
     }

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
          // TODO Auto-generated method stub
          return null;
     }
}

 

⑤ 修改mainActivity.java,添加Gallery 相关操作

package zyf.Ex_Ctrl_10ME;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;


public class Ex_Ctrl_10ME extends Activity {
    // Called when the activity is first created.
    //定义要使用的对象
    private Gallery gallery;
    private ImageView imageview;

    private myImageAdapter imageadapter;
   

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imageadapter=new myImageAdapter(this);


        //通过findViewById 取得资源对象
        gallery=(Gallery)findViewById(R.id.Gallery_preView);
        imageview=(ImageView)findViewById(R.id.ImageView_photo);


        //给Gallery设置适配器把Ex_Ctrl_10ME类传入参数
        gallery.setAdapter(imageadapter);
       

        //设置Gallery的点击事件监听器,将受到点击的图片从 ImageView 中显示出来
        gallery.setOnItemClickListener(new Gallery.OnItemClickListener(){         

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position,long id) {
                // TODO Auto-generated method stub
                //显示该图片是几号
                Toast.makeText(Ex_Ctrl_10ME.this,
                                    "这是图片:"+position+"号", Toast.LENGTH_SHORT).show();
                //设置大图片
                imageview.setBackgroundResource(imageadapter.myImageIds[position]);
            }
        });
    }
}

 

⑥ 修改myImageAdapter.java 文件,实现相簿浏览效果

package zyf.Ex_Ctrl_10ME;
import android.content.Context;
import android.content.res.TypedArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;


public class myImageAdapter extends BaseAdapter{

    //自定义的类变量
    //变量声明
    int mGalleryItemBackground;
    private Context context;  //上下文
    //构建一Integer array 并取得预加载Drawable 的图片id ,这些图片都是存放于 res/drawable 文件夹下的

    public Integer[] myImageIds = { R.drawable.photo1, R.drawable.photo2,
                     R.drawable.photo3, R.drawable.photo4, R.drawable.photo5,R.drawable.photo6,
 };
   

    //自定义的构造方法
    public myImageAdapter(Context context) {
        // TODO Auto-generated constructor stub
        this.context=context;
        //使用在res/values/attrs.xml 中的<declare-styleable>定义的Gallery 属性.
        TypedArray typed_array=context.obtainStyledAttributes(R.styleable.Gallery);
        //取得Gallery 属性的Index id
       mGalleryItemBackground=typed_array.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
        // 让对象的styleable 属性能够反复使用
        typed_array.recycle();
    }

 

    //重写的方法getCount,返回图片数目
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return myImageIds.length;
    }

 

    // 重写的方法getItemId,返回图像的数组id 
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

 

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

 

    //重写的方法getView,返回一View 对象
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        // 产生ImageView 对象

        ImageView imageview = new ImageView(context);
        // 设置图片给imageView 对象
        imageview.setImageResource(myImageIds[position]);

        // 重新设置图片的宽高
        imageview.setScaleType(ImageView.ScaleType.FIT_XY);
        // 重新设置Layout 的宽高
        imageview.setLayoutParams(new Gallery.LayoutParams(128, 128));
        // 设置 imageview 背景图
        imageview.setBackgroundResource(mGalleryItemBackground);
        // 返回imageView 对象
        return imageview;
    }
}

 

⑦ 结果

技术分享

关键点

1. Gallery 控件 (画廊)

   Gallery 控件 是 android 中的图片浏览控件。一个锁定中心条目并且拥有水平滚动列表的视图。如下图:

   技术分享
  Gallery(画廊)使用Theme_galleryItemBackground作为Gallery(画廊)适配器中的各视图的默认参数。如果你没有设置,你就需要调整一些Gallery(画廊)的属性,比如间距。

  Gallery(画廊)中的视图应该使用Gallery.LayoutParams作为它们的布局参数类型。参见Gallery tutorial
  

   API介绍:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4996.html

 

2. BaseAdapter

   BaseAdaper 是 适配器Adapter类的子类,是一个抽象类。

  

 

18. SDCard 中文件搜索与File 类

示例代码

① 创建新工程

② 在string.xml 添加程序中要使用的字符串

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name"> myFileTest</string>
      <string name="showInput"> 输入关键字</string>
    <string name="toSearch"> 搜索</string>

    <string name="info"> 系统SDCard目录文件路径:\n</string>
    <string name="pleaseInput"> 请输入关键字!! </string>
    <string name="notFond"> 没有找到相关文件!! </string>
    <string name="pathError"> 读取路径出错!! </string>
</resources>

 

③ 修改main.xml 布局,添加两个TextView、一个EditText、一个Button

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="
http://schemas.android.com/apk/res/android"
>

<Button
    android:id="@+id/Button_Search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="253px"
    android:layout_y="5px"
    android:text="@string/toSearch" >
</Button>
<EditText
    android:id="@+id/input_KEY_EditText"
    android:layout_width="112px"
    android:layout_height="52px"
    android:textSize="18sp"
    android:layout_x="119px"
    android:layout_y="4px" >

</EditText>

<TextView
    android:id="@+id/TextView_showIn"
    android:layout_width="103px"
    android:layout_height="29px"
    android:textSize="20sp"
    android:layout_x="5px"
    android:layout_y="16px"
    android:text="@string/showInput" >
</TextView>
<TextView
    android:layout_width="fill_parent"
    android:layout_height="370px"
    android:layout_x="0px"
    android:layout_y="60px"
    android:id="@+id/TextView_Result" >
</TextView>
</AbsoluteLayout>

 

④ 修改mainActivity.java 文件,添加搜索功能

package zyf.myFileTest;
//导入程序使用的包
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class myFileTest extends Activity implements Button.OnClickListener {
    //Called when the activity is first created. 
    //定义程序要使用的类对象
    private File file;
    private String path;
    private String info;
    private String theKey_formInput;
    private TextView show_Result;
    private EditText input_SearchKey_Edit;
    private Button toSearch_Button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //设置主屏布局为main.xml
        setContentView(R.layout.main);
        //通过findViewById()获取XML中的UI对象
        show_Result = (TextView) findViewById(R.id.TextView_Result);
        input_SearchKey_Edit = (EditText) findViewById(R.id.input_KEY_EditText);
        toSearch_Button = (Button) findViewById(R.id.Button_Search );
        //为搜索按钮添加点击事件监听器
        toSearch_Button.setOnClickListener(this);
        //初始化一个Fiel 对象,指定路径为/sdcard
        file = new File( "/sdcard" );
        //从xml中获取字符串
        info = getString(R.string.info);
    }

 

    //按钮点击事件处理
    public void onClick(View v) {
        // TODO Auto-generated method stub
        //清空
        path = "";
        show_Result.setText("");
        //取得输入框中的要查询的Key
        theKey_formInput = input_SearchKey_Edit.getText().toString();
        //浏览文件
        BrowserFile( file );
    }

   

    //浏览文件方法
    public void BrowserFile(File file) {
        if (theKey_formInput.equals("")) {
            //如果输入框没有输入点击搜索按钮,提示输入
            Toast.makeText(this, getString(R.string.pleaseInput),
            Toast.LENGTH_SHORT).show();
        } else {
            //开始搜索文件
            ToSearchFiles(file);
            //搜索完毕后,如果搜到结果为空,提示没有找到
            if (show_Result.getText().equals("")) {
                Toast.makeText(this, getString(R.string.notFond),
                Toast.LENGTH_SHORT).show();
            }
        }
    }

 

    //开始搜索文件方法
    public void ToSearchFiles(File file) {
        //定义一个File文件数组,用来存放 /sdcard 目录下的文件或文件夹
        File[] the_Files = file.listFiles() ;

        //通过遍历所有文件和文件夹
        for (File tempF : the_Files) {
            if (tempF.isDirectory()) {
                ToSearchFiles(tempF);
                //如果是文件夹的话继续遍历搜索
            } else

           {
            try {
                //是文件,进行比较,如果文件名称中包含输入搜索Key,则返回大于-1的值
                if (tempF.getName().indexOf(theKey_formInput) > -1) {
                    //获取符合条件文件的路径,进行累加
                    path += "\n" + tempF.getPath();
                    //显示结果的TextView显示信息和搜索到的路径
                    show_Result.setText(info + path);
                }
            } catch (Exception e) {
                // TODO: handle exception
                //如果路径找不到,提示出错

                Toast.makeText(this, getString(R.string.pathError),Toast.LENGTH_SHORT).show();
            }
            }
        }
    }
}

 

⑤ 结果

 技术分享

关键点

1. 文件操作使用的 java 包

    android 的文件搜索操作 是用的 java.io.file 包。

    android 的文件读写 是跟 javaSE 相同的,都是使用的I/O流。需要用到的是 java.io.FileInputStream 包 和 java.io.FileOutputStream 包。可以通过 context.openFileOutput 和 context.openFileInput 的到输出和输入的流对象。

   

2. for循环 for( int x : n)

   这个for循环是JDK1.5的新特性泛型的for循环

   以下为例,两个for循环其实效果等同,那个更简单呢?
   第二个for循环在编译的时候会强直检查list中的对象类型是否是UserBean类型,如果不是会报编译错误
   第一个for循环编译没有问题,会在运行的时候报错
   相比之下第二种方法对于程序的稳定性更有利,而且不用显示的类型转换,提升了软件性能,泛型编程也是JAVA提倡的。

   for(int loop=0;loop<list.size();loop++){
           UserBean bean = (UserBean )list.get(loop); //显示的类型转换
           System.out.println(UserBean .getName());
   }

   for(UserBean bean : list ) {
         System.out.println(bean.getName());
   }

 

 

[转]android学习----基础UI编程(六)

标签:

原文地址:http://www.cnblogs.com/wj033/p/4569710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!