`
fokman
  • 浏览: 242698 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

android 自定义导航控件

 
阅读更多

    在编写android应用程序的过程中,经常会使用到导航控件。如果每一个activity都需要用到导航控件,可以将这个导航控件独立出来,方便程序开发。

   写一个导航的代码类:

  

public class NavigationBar extends RelativeLayout implements OnClickListener {

    public static final int NAVIGATION_BUTTON_LEFT = 0;
    public static final int NAVIGATION_BUTTON_RIGHT = 1;

    private Context mContext;
    private NavigationBarListener mListener;

    public NavigationBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public NavigationBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public NavigationBar(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
        mContext = context;

        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(-1, -2);
        this.setLayoutParams(lp);
        this.setBackgroundResource(R.drawable.navigation_bar_bg);
    }

    public void setLeftBarButton(String title) {
        setButton(title, NAVIGATION_BUTTON_LEFT);
    }

    public void setRightBarButton(String title) {
        setButton(title, NAVIGATION_BUTTON_RIGHT);
    }

    private void setButton(String title, int which) {
        // remove the old button (if there is one)
        Button oldButton = (Button) this.findViewWithTag(new Integer(which));
        if (oldButton != null)
            this.removeView(oldButton);

        Button newButton = new Button(mContext);
        newButton.setTag(new Integer(which)); // used to determine which button is pressed and to remove old buttons

        // set OnClickListener
        newButton.setOnClickListener(this);

        // set LayoutParams
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(-2, -2);
        if (which == NAVIGATION_BUTTON_LEFT)
            lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        else if (which == NAVIGATION_BUTTON_RIGHT)
            lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        else
            throw new IllegalArgumentException("Parameter 'which' must be 0 or 1");
        lp.addRule(RelativeLayout.CENTER_VERTICAL);
        lp.setMargins(10, 0, 10, 0);
        newButton.setLayoutParams(lp);

        // set button text
        newButton.setText(title);
        newButton.setTextSize(12);
        newButton.setTextColor(Color.WHITE);

        // set button drawable
        newButton.setBackgroundResource(R.drawable.navigation_bar_btn);

        // add button
        this.addView(newButton);
    }

    public void setBarTitle(String title) {
        // remove old title (if exists)
        TextView oldTitle = (TextView) this.findViewWithTag("title");
        if (oldTitle != null)
            this.removeView(oldTitle);

        TextView newTitle = new TextView(mContext);
        newTitle.setTag("title");

        // set LayoutParams
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(-2, -2);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        lp.setMargins(0, 30, 0, 30);
        newTitle.setLayoutParams(lp);

        // set text
        newTitle.setText(title);
        newTitle.setTextSize(22);
        newTitle.setTextColor(Color.WHITE);

        // add title to NavigationBar
        this.addView(newTitle);
    }

    public void setNavigationBarListener(NavigationBarListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View v) {
        int which = ((Integer) v.getTag()).intValue();
        if (mListener != null) {
            mListener.OnNavigationButtonClick(which);
        }
    }

    /**
     * Listener for NavigationBar.
     */
    public interface NavigationBarListener {

        /**
         * Called when the user presses either of the buttons on the NavigationBar.
         *
         * @param which - indicates which button was pressed, ie: NavigationBar.NAVIGATION_BUTTON_LEFT
         */
        public void OnNavigationButtonClick(int which);
    }
}

 背景样式定义navigation_bar_bg.xml:

  

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
                  <gradient android:angle="270" android:endColor="#ff050708" android:startColor="#ff595959" android:type="linear" />
    	</shape>
    </item>

</selector>

 导航按钮样式定义navigation_bar_btn.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <gradient android:angle="270" android:endColor="#ff495a95" android:startColor="#ff7684c1" />
            
            <stroke android:width="1px" android:color="#FF000000" />
            <corners android:radius="6dp" />
            <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient android:angle="270" android:endColor="#ff999999" android:startColor="#ff333333" />
            
            <stroke android:width="1px" android:color="#FF000000" />
            <corners android:radius="6dp" />
            <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
        </shape>
    </item>
</selector>

 那么在activity怎么使用呢?

activity调用代码如下:

  

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.change_device);
		NavigationBar nb = (NavigationBar)findViewById(R.id.detailNavBar);
        nb.setLeftBarButton(getString(R.string.cancel));
        nb.setRightBarButton(getString(R.string.save));
        nb.setBarTitle(getString(R.string.details));
        NavigationBar.NavigationBarListener nbl = new NavigationBar.NavigationBarListener() {
            @Override
            public void OnNavigationButtonClick(int which) {
                if (which == NavigationBar.NAVIGATION_BUTTON_LEFT) {
                    finish();
                } else {
                	
                }
            }
        };
        nb.setNavigationBarListener(nbl);
}

 在layout里面定义我们的导航控件

  

<?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/white"
    android:orientation="vertical" >
    <com.NavigationBar
        android:id="@+id/detailNavBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/deviceName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/removeBtn"
        android:layout_width="260dp"
        android:background="@drawable/btn_red"
        android:layout_height="wrap_content"
        style="@style/ButtonText"
        android:layout_gravity="center_horizontal"
        android:text="@string/remove" />

</LinearLayout>

 现在看看效果图:

那么在你以后想使用这个控件的时候,就可以直接调用了。

分享到:
评论

相关推荐

    Android自定义导航控件动态添加控件一

    在Android开发中,自定义导航控件是一种常见的需求,它能提供更为灵活和个性化的界面设计。本教程将深入探讨如何在Android应用中创建一个自定义的导航控件,并通过动态添加控件来实现功能的扩展。我们将主要关注以下...

    Android 自定义地图控件,可放大缩小拖动,加点加线

    总的来说,这个项目涵盖了Android自定义视图、手势识别、图像缩放和平移以及图形绘制等多个关键知识点。通过这样的实践,开发者可以深入理解Android系统的底层机制,并提升自己的定制化开发能力。在实际应用中,这样...

    Android 自定义标题导航控件

    本文将详细讲解如何创建一个自定义的标题导航控件,分为五个关键步骤。 ### 1. 自定义控件属性的定义 首先,我们需要定义自定义控件的属性。这通常在`res/values/attrs.xml`文件中进行。例如,我们可以定义标题...

    Android自定义控件实现导航条IndicatorView

    在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将深入探讨如何实现一个自定义的...不断学习和实践,将帮助你更好地理解和掌握Android自定义控件的精髓,为你的应用带来更丰富的用户体验。

    Android应用源码之Android 自定义头部控件,简单易用.zip

    标题“Android应用源码之Android 自定义头部控件,简单易用.zip”提示我们,这个压缩包包含了一个关于Android自定义头部控件的源码示例,其特点是简单易用。下面我们将深入探讨这一主题。 首先,自定义头部控件通常...

    android自定义分页控件

    在客户端,我们可以使用RecyclerView或者ListView来展示这些数据,并结合自定义的分页控件进行导航。 在Android中,创建自定义分页控件的第一步是设计UI。一个基本的分页控件通常包括页码显示、加载更多按钮以及...

    安卓自定义控件相关-Android自定义头部控件简单易用.rar

    本资源“安卓自定义控件相关-Android自定义头部控件简单易用.rar”提供了关于创建自定义头部控件的示例,这在构建具有个性化的APP时非常有用。 标题中的“自定义头部控件”通常指的是在应用顶部显示的区域,如导航...

    android自定义导航栏

    在Android开发中,自定义导航栏是一个常见的需求,特别是在追求个性化设计和功能扩展时。本文将详细介绍如何在Android项目中创建一个可以滑动且数量可变的自定义导航栏,以此来满足特定的用户交互需求。 首先,我们...

    Android 自定义头部控件,简单易用.zip

    在Android应用开发中,自定义...开发者可以通过这个案例深入理解Android自定义控件的原理和实现,提升自己的开发技能。同时,这也是一个很好的实践机会,学习如何在实际项目中应用自定义控件,以满足应用的独特需求。

    Android 自定义控件

    以上就是Android自定义控件的一般流程和`StickyNavLayout`的关键特性。实际开发中,开发者通常会结合Android的属性动画、RecyclerView分组视图等高级特性,使自定义控件更加灵活和强大。同时,使用Kotlin的扩展函数...

    Android 自定义头部控件

    在Android应用开发中,自定义头部控件是一个常见的需求,它可以为应用提供独特的用户体验和界面设计。本篇文章将深入探讨如何实现一个自定义的多变头部控件,以供开发者们借鉴和学习。 首先,我们要理解头部控件...

    《Android自定义控件入门到实战》源码2018.10

    《Android自定义控件入门到实战》是一本深入讲解Android平台下自定义控件开发的教程,源码2018.10版提供了一套完整的实践案例,帮助开发者从基础到进阶全面掌握自定义控件的制作技巧。这份资料涵盖了从基本的自定义...

    Android 自定义头部控件,简单易用-IT计算机-毕业设计.zip

    本项目“Android自定义头部控件,简单易用”是一个毕业设计学习的源码Demo,旨在帮助开发者掌握如何在Android应用中创建自定义视图组件。 首先,我们要理解在Android中自定义头部控件的重要性。通常,头部控件包括...

    Android 自定义头部控件,简单易用.zip源码资源下载

    首先,我们要理解Android自定义控件的基本流程。这通常包括以下步骤: 1. **创建布局文件**:在res/layout目录下创建XML布局文件,定义自定义头部控件的视图结构。你可以包含各种Android原生组件,如ImageView、...

    android 自定义组合控件 顶部导航栏

    本文将深入探讨如何在Android中创建一个自定义的顶部导航栏,这个控件可以作为应用的主要交互入口,展示多个可选的页面或功能。 首先,让我们了解顶部导航栏的基本构成。通常,它包含以下几个部分: 1. **标题**:...

    Android高级应用源码-Android 自定义头部控件,简单易用.zip

    2. **自定义头部控件的设计**:头部控件通常用于显示应用的主要标识或导航元素。设计时应考虑其在不同屏幕尺寸和方向上的适应性,以及与触摸事件的交互。 3. **布局管理**:可能使用到LinearLayout、RelativeLayout...

    安卓Android源码——安卓Android 自定义头部控件,简单易用.rar

    首先,自定义头部控件通常用于应用的顶部,可以包含导航栏、标题、搜索框等元素,以提供独特的视觉效果和交互体验。在Android中,开发者可以利用View或ViewGroup类来创建自定义控件。对于初学者来说,理解View和...

    安卓开发-Android 自定义头部控件,简单易用.zip

    总的来说,Android自定义头部控件允许开发者打破系统的限制,创造出符合应用风格的独一无二的UI元素。通过熟练掌握自定义控件的创建方法,开发者不仅可以提升应用的用户体验,还能提高自身在Android开发领域的专业...

Global site tag (gtag.js) - Google Analytics