Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

高仿知乎项目制作流程详解------------第一解:自定义组件的使用

$
0
0

首先来看一下我实现的效果图:


从”我的关注”开始,每一个条目都是一个自定义组合控件.下面,我来讲解一下具体实现步骤:

 

一.根据知乎的样式,创建并完成布局文件.

在本页面所有的自定义组件中,只有”夜间模式”一项最为复杂,在条目布局的右侧增加了一个按钮,所以我们就选择它作为自定义组件的基础布局.


具体布局如下:

<pre name="code" class="html"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/selector_msi">

    <ImageView
        android:id="@+id/iv_more_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:paddingLeft="15dp"
        android:src="@drawable/ic_remove_red_eye_white_18dp"
        android:tint="@android:color/darker_gray" />

    <TextView
        android:id="@+id/tv_moretext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/iv_more_icon"
        android:paddingLeft="15dp"
        android:text="我的关注"
        android:textSize="16sp" />

    <ImageView
        android:id="@+id/iv_more_line"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_alignLeft="@+id/tv_moretext"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="15dp"
        android:background="@drawable/list_divider"
        android:tint="@android:color/darker_gray"></ImageView>

    <Switch
        android:id="@+id/switch_more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:paddingRight="10dp"
        android:visibility="invisible"
         />

</RelativeLayout>





二.设置自定义组件的属性

在res文件夹中,找到values文件夹,创建attrs.xml文件,在里面就可以对自定义组件的属性进行设置了,具体代码如下:

<pre name="code" class="html"><declare-styleable name="MorePersonalSettingItem">
        <!--设置条目文字-->
        <attr name="moretext" format="string" ></attr>
        <!--设置条目是否显示下方横线-->
        <attr name="isShowLine" format="boolean"></attr>
        <!--设置条目图片样式-->
        <attr name="moreicon" format="reference"></attr>
        <!--设置条目是否显示右侧按钮-->
        <attr name="isShowToggle" format="boolean"></attr>
    </declare-styleable>


三.创建自定义组件类,继承相应的布局,并给相应属性设置业务逻辑

为了使自定义组件的属性发挥作用,我们还需要通过代码实现对应的业务逻辑,这就需要创建自定义组件的类了,根据组件布局特点,我们让它继承RelativeLayout布局,当然其他布局也可以,感兴趣的朋友可以自行尝试.我的自定义组件命名为MorePersonalSettingItem.
具体实现代码如下:

public class MorePersonalSettingItem extends RelativeLayout {

    private static final String NAMESPACE = "http://schemas.android.com/apk/res-auto";
    private ImageView iv_more_icon;
    private ImageView iv_more_line;
    private TextView tv_moretext;
    private Switch switch_more;

    public MorePersonalSettingItem(Context context) {
        this(context,null);
    }

    public MorePersonalSettingItem(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MorePersonalSettingItem(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //找到各个属性
        String moreText = attrs.getAttributeValue(NAMESPACE,"moretext");
        Boolean isShowLine = attrs.getAttributeBooleanValue(NAMESPACE,"isShowLine",true);
        int moreicon = attrs.getAttributeResourceValue(NAMESPACE, "moreicon", R.drawable.ic_live_tiny);
        Boolean isShowToggle = attrs.getAttributeBooleanValue(NAMESPACE,"isShowToggle",false);

        initView();

        iv_more_icon.setImageResource(moreicon);
        tv_moretext.setText(moreText);

        //判断是否显示横线
        if(isShowLine){
            iv_more_line.setVisibility(View.VISIBLE);
        } else {
            iv_more_line.setVisibility(View.INVISIBLE);
        }
        //判断是否显示按钮
        if(isShowToggle){
            switch_more.setVisibility(View.VISIBLE);
        } else {
            switch_more.setVisibility(View.INVISIBLE);
        }
    }

    public void initView(){
        //加载布局
        View view = View.inflate(getContext(), R.layout.more_setting_item,null);
        iv_more_icon = (ImageView)view.findViewById(R.id.iv_more_icon);
        iv_more_line = (ImageView)view.findViewById(R.id.iv_more_line);
        tv_moretext = (TextView)view.findViewById(R.id.tv_moretext);
        switch_more = (Switch)view.findViewById(R.id.switch_more);
        addView(view);
    }
}

四.使用自定义组件

这时候,我们的自定义组件就算创建完成了,可以到相应的布局文件中直接使用了.需要注意的是,在使用自定义组件的时候,一定要在组件名称前加上全包名,

并在外层大布局添加属性:

xmlns:app="http://schemas.android.com/apk/res-auto"

这样,在编译的时候才能找到对应的控件和属性,否则会报错

使用实例代码如下:

<!--第二块内容,个人设置-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="6dp"
        android:orientation="vertical">

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_concern"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:moreicon="@drawable/ic_follow_more"
            app:moretext="我的关注"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_collect"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:moreicon="@drawable/ic_grade"
            app:moretext="我的收藏"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_draft"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:moreicon="@drawable/ic_draft_more"
            app:moretext="我的草稿"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_scan_nearby"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:moreicon="@drawable/ic_recent_views"
            app:moretext="最近浏览"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_zhihu"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:moreicon="@drawable/ic_zhi_logo"
            app:moretext="我的值乎"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_live"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="false"
            app:moreicon="@drawable/ic_feed_livebanner_logo"
            app:moretext="我的Live"></com.example.zhihu10.ui.MorePersonalSettingItem>

    </LinearLayout>
    <!--第三块内容,属性设置-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:orientation="vertical">

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_night_mode"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="true"
            app:isShowToggle="true"
            app:moreicon="@drawable/ic_nightmode_more"
            app:moretext="夜间模式"></com.example.zhihu10.ui.MorePersonalSettingItem>

        <com.example.zhihu10.ui.MorePersonalSettingItem
            android:id="@+id/msi_my_setting"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:isShowLine="false"
            app:moreicon="@drawable/ic_drawer_settings"
            app:moretext="设置"></com.example.zhihu10.ui.MorePersonalSettingItem>

    </LinearLayout>
</LinearLayout>

好啦,自定义组件的简单使用我们就讲完了,当然这只是非常简单的例子,通过自定义组件,我们可以完成更多Android自带控件所不能完成的功能,进而实现更为复杂的布局和设置更美观的页面,这些就留待以后在具体的案例中讲解吧.

最后,感谢大家浏览我的博客,希望在Android开发的道路上一起成长!







作者:newone_helloworld 发表于2016/9/3 15:14:49 原文链接
阅读:104 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>