21. “我”模块(二)之星座选择

上一节对“我”模块(一)进行了综述(可参见 “我”模块(一) 进行了解),接下来将从“我”模块(二)开始详细介绍:

知识点

  • 掌握“日历”界面的开发,使用日历展示当前年份
  • 掌握“星座”界面的开发,选择不同的星座展示不同的运势
  • 掌握“涂鸦”界面的开发,实现图画的绘制功能
  • 掌握“地图”界面的开发,可以定位一个指定地点

星座

任务综述:
点击“星座”界面右上角的“切换”按钮会弹出“星座选择”界面,该界面主要用于展示十二星座的图标、名称、阳历日期,点击“星座选择”界面上的任意一个星座,会显示对应星座的详细信息。

7. “星座选择”界面

任务分析:
“星座选择”界面主要用于展示十二星座的相关信息,界面效果如图所示。

10186693-11ba98e2dba7ec94.png
“星座选择”界面

任务实施:
(1)创建“星座选择”界面:ChooseConstellationActivity & activity_choose_constellation。

(2)导入界面图片(choose_constella_close_icon)。

(3)放置界面控件。
一个ImageView控件用于显示关闭按钮;
一个TextView控件用于显示“选择星座”文字;
一个View控件用于显示灰色分割线;
一个RecyclerView控件用于显示十二星座的列表信息。

activity_choose_constellation.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:background="@android:color/transparent"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/iv_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:src="@drawable/choose_constella_close_icon" />
    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:orientation="vertical">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="8dp"
            android:text="选择星座"
            android:textColor="@color/choose_constellation_title_color"
            android:textSize="14sp" />
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:background="@color/divider_line_color" />
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_list"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:divider="@null"
            android:dividerHeight="0dp"
            android:fadingEdge="none"
            android:paddingBottom="8dp"
            android:paddingTop="8dp" />
    </LinearLayout>
</LinearLayout>

(4)修改colors.xml,添加一个名为choose_constellation_title_color的颜色值用于设置选择星座文本的颜色。

   <color name="choose_constellation_title_color">#8bdcea</color>

8. “星座选择”界面Item

任务分析:
“星座选择”界面是使用RecyclerView控件展示十二星座列表的,因此需要创建一个该列表的Item界面。在Item界面中需要展示星座图标、名称以及阳历日期,界面如图所示。

10186693-5f0cfeab76a97dce.png
“星座选择”界面Item

任务实施:
(1)创建“星座选择”界面Item:choose_constella_item.xml。

(2)放置界面控件。
一个ImageView控件用于显示星座图片;
两个TextView控件分别用于显示星座名称与星座阳历日期。

choose_constella_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="240dp"
    android:layout_height="25dp"
    android:layout_marginLeft="30dp"
    android:background="@android:color/white"
    android:gravity="center_vertical">
    <ImageView
        android:id="@+id/iv_constella_img"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:scaleType="fitXY" />
    <TextView
        android:id="@+id/tv_contella_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:textColor="@android:color/black"
        android:textSize="13sp" />
    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:textColor="@android:color/black"
        android:textSize="13sp" />
</LinearLayout>

9. “星座选择”界面Adapter

任务分析:
“星座选择”列表界面是使用RecyclerView控件战士星座信息,因此需要创建一个数据适配器ChooseConstellationListAdapter对RecyelerView控件进行数据适配。

任务实施:
(1)创建ChooseConstellationListAdapter类。在adapter包中创建一个ChooseConstellaListAdapter类继承RecyclerView.Adapter<RecyclerView.ViewHolder>类,并重写onCreateViewHolder()、onBindViewHolder()、getItemCount()方法。

(2)创建ViewHolder类。在ChooseConstellaListAdapter类中创建一个ViewHolder类用于获取Item界面上的控件。

ChooseConstellationListAdapter.java

public class ChooseConstellaListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
    private List<ConstellationBean> cbList;
    private Context context;
    private OnItemClickListener mOnItemClickListener = null;
    public ChooseConstellaListAdapter(Context context) {
        this.context = context;
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }
    public void setData(List<ConstellationBean> cbList) {
        this.cbList = cbList;
        notifyDataSetChanged();
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
    {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.
                choose_constella_item, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        view.setOnClickListener(this);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int i) {
        ConstellationBean bean = cbList.get(i);
        ((ViewHolder) holder).tv_contella_name.setText(bean.getName());
        ((ViewHolder) holder).tv_date.setText(bean.getDate());
        Glide
                .with(context)
                .load(bean.getImg())
                .error(R.mipmap.ic_launcher)
                .into(((ViewHolder) holder).iv_img);
        //将i保存在itemView的Tag中,以便点击时进行获取
        holder.itemView.setTag(i);
    }
    @Override
    public int getItemCount() {
        return cbList == null ? 0 : cbList.size();
    }
    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取position
            mOnItemClickListener.onItemClick(v, (int) v.getTag());
        }
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_contella_name, tv_date;
        public ImageView iv_img;
        public ViewHolder(View itemView) {
            super(itemView);
            tv_contella_name = (TextView) itemView.findViewById(R.id.tv_contella_name);
            tv_date = (TextView) itemView.findViewById(R.id.tv_date);
            iv_img = (ImageView) itemView.findViewById(R.id.iv_constella_img);
        }
    }
    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }
}

10.“星座选择”界面数据

任务分析:
“星座选择”界面的图片存放在Tomcat的ROOT文件夹中的constellation文件夹中数据是通过在ROOT文件夹中创建一个choose_constellation_list_data.json文件存放的。

任务实施:
(1)存放“星座选择”界面的图片。将“星座选择”界面需要的图片放入Tomcat的ROOT/newsdemo/topline/img/constellation文件夹中。

(2)创建“星座选择”界面数据文件。在Tomcat的ROOT/nesdemo目录中创建一个choose_constellation_list_data.json文件,该文件用于存放“星座选择”界面需要加载的数据。

choose_constellation_list_data.json

[
{
"id":1,
"name":"白羊座",
"img":"http://172.25.32.1:8080/newsdemo/img/constellation/baiyang_icon.png",
"date":"(阳历3.21-4.19)",
},
……
{
"id":12,
"name":"双鱼座",
"img":"http://172.25.32.1:8080/newsdemo/img/constellation/shuangyu_icon.png",
"date":"(阳历2.19-3.20)",
}
]

(3)修改Constant.java文件。在utils包中的Constant类中添加一个名为REQUEST_CHOOSE_CONSTELLATION_LIST_URL的“星座选择”界面接口地址。

//星座选择界面接口
    public static final String REQUEST_CHOOSE_CONSTELLATION_LIST_URL = "/choose_constellation_list_data.json";

11.“星座选择”界面逻辑代码

任务分析:
“星座选择”界面主要显示星座的图标、名称以及阳历日期。点击每个星座会关闭界面并显示“星座选择”界面,同时会把选择的星座Id回传给“星座”界面。

任务实施:
(1)获取界面控件。在ChooseConstellationActivity中创建界面控件的初始化方法init(),获取“星座选择”界面所要用到的控件。

(2)获取数据。在ConstellationActivity中创建getData()方法,用于获取服务器中的十二星座信息数据。

ChooseConstellationActivity.java

public class ChooseConstellationActivity extends AppCompatActivity {
    private ImageView iv_close;
    private ChooseConstellaListAdapter adapter;
    private OkHttpClient okHttpClient;
    public static final int MSG_CHOOSE_CONSTELLATION_OK = 1;//获取星座数据
    private MHandler mHandler;
    private RecyclerView recyclerView;
    private List<ConstellationBean> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_choose_constellation);
        mHandler = new MHandler();
        okHttpClient = new OkHttpClient();
        getData();
        init();
    }
    private void init() {
        iv_close = (ImageView) findViewById(R.id.iv_close);
        recyclerView = (RecyclerView) findViewById(R.id.rv_list);
        //这里用线性显示 类似于   ListView
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new ChooseConstellaListAdapter(ChooseConstellationActivity.this);
        recyclerView.setAdapter(adapter);
        iv_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ChooseConstellationActivity.this.finish();
            }
        });
        adapter.setOnItemClickListener(new ChooseConstellaListAdapter.
                OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Intent intent = new Intent();
                intent.putExtra("id", list.get(position).getId());
                setResult(RESULT_OK, intent);
                ChooseConstellationActivity.this.finish();
            }
        });
    }
    /**
     * 事件捕获
     */
    class MHandler extends Handler {
        @Override
        public void dispatchMessage(Message msg) {
            super.dispatchMessage(msg);
            switch (msg.what) {
                case MSG_CHOOSE_CONSTELLATION_OK:
                    if (msg.obj != null) {
                        String result = (String) msg.obj;
                        list = JsonParse.getInstance().getConstellaList(result);
                        if (list != null) {
                            if (list.size() > 0) {
                                adapter.setData(list);
                            }
                        }
                    }
                    break;
            }
        }
    }
    private void getData() {
        Request request = new Request.Builder().url(Constant.WEB_SITE +
                Constant.REQUEST_CHOOSE_CONSTELLATION_LIST_URL).build();
        Call call = okHttpClient.newCall(request);
        //开启异步线程访问网络
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Response response) throws IOException {
                String res = response.body().string();
                Message msg = new Message();
                msg.what = MSG_CHOOSE_CONSTELLATION_OK;
                msg.obj = res;
                mHandler.sendMessage(msg);
            }
            @Override
            public void onFailure(Request arg0, IOException arg1) {
            }
        });
    }
}

(3)修改清单文件。由于“星座选择”界面是对话框的样式,在清单文件的ChooseConstellationActivity对应的activity标签中添加如下代码:

        <activity
            android:name=".activity.ChooseConstellationActivity"
            android:theme="@style/AppTheme.NoTitle.Dialog" />

(4)修改“星座”界面逻辑代码。由于点击“星座”界面右上角的“切换”按钮会跳转到“星座选择”界面,因此需要在ConstellationActivity的init()方法,在该方法找找到tv_switch控件的点击事件,并在该控件的点击事件中添加如下代码:

 Intent intent = new Intent(ConstellationActivity.this,ChooseConstellationActivity.class);
      startActivityForResult(intent, 1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值