b2c信息网

您现在的位置是:首页 > 昨日新闻 > 正文

昨日新闻

android导航栏源码(安卓开发顶部导航栏)

hacker2022-07-14 23:05:46昨日新闻79
本文目录一览:1、android底部导航栏怎么做,2、

本文目录一览:

android底部导航栏怎么做,

可以使用radiogroup做底部导航

radiogroup的属性自定义,并设置android:button="@null"

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:layout_width="fill_parent"

android:layout_height="60dip"

android:background="@drawable/bottom_bg"

android:orientation="horizontal"

RadioGroup

android:layout_width="fill_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

RadioButton

style="@style/navigation_bottom_radio"

android:drawableTop="@drawable/bottom_home_d"

android:text="@string/home_tv" /

RadioButton

style="@style/navigation_bottom_radio"

android:drawableTop="@drawable/bottom_looks_d"

android:text="@string/style_tv" /

RadioButton

style="@style/navigation_bottom_radio"

android:drawableTop="@drawable/bottom_cam"

android:gravity="center"

android:text="拍照"

/

RadioButton

style="@style/navigation_bottom_radio"

android:drawableTop="@drawable/bottom_shopping_d"

android:text="@string/shopping_tv" /

RadioButton

style="@style/navigation_bottom_radio"

android:drawableTop="@drawable/bottom_show_d"

android:text="@string/show_tv" /

/RadioGroup

/LinearLayout

resources

style name="navigation_bottom_radio"

!-- 内部组件的排列 --

item name="android:gravity"center_horizontal/item

!-- 背景样式 --

item name="android:background"@drawable/style_navigation_radio/item

!-- 宽度 --

item name="android:layout_width"fill_parent/item

!-- 高度 --

item name="android:layout_height"wrap_content/item

!-- 设置RadioButton的原来图片为空 --

item name="android:button"@null/item

!-- 与其他组件宽度占相同比重 --

item name="android:layout_weight"1.0/item

!-- 底部的空隙 --

item name="android:paddingBottom"2.0dip/item

!-- 顶部的空隙 --

item name="android:paddingTop"2.0dip/item

!-- 文字的大小 --

item name="android:textSize"11dip/item

!-- 文字的颜色 --

item name="android:textColor"@color/white/item

/style

/resources

参考:

如何控制android系统中NavigationBar 的显示与隐藏

我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键。如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在屏幕的下方加了一个小黑条,在这个黑条上有3个按钮控件,这种设置无疑使得手机的外观的设计更加简约。但我遇到身边用Nexus 4手机的人都吐槽这种设计,原因很简单:好端端的屏幕,被划出一块区域用来显示3个按钮(如下图所示):Back, Home, Recent。并且它一直用在那里占用着。

在android源码中,那一块区域被叫做NavigationBar。同时,google在代码中也预留了标志,用来控制它的显示与隐藏。NavigationBar的显示与隐藏的控制是放在SystemU中的,具体的路径是:\frameworks\base\packages\SystemUI。对android4.0以上的手机而言,SystemUi包含两部分:StatusBar和NavigationBar。在SystemUI的工程下有一个类PhoneStatusBar.java,在该类中可以发现关于控制NavigationBar的相关代码:

在start()方法里可以看到NavigationBar是在那时候被添加进来,但只是添加,决定它显示还是隐藏是在后面控制的。

span style="font-size:18px;"@Override

public void start() {

mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))

.getDefaultDisplay();

updateDisplaySize();

/// M: Support Smartbook Feature.

if (SIMHelper.isMediatekSmartBookSupport()) {

/// M: [ALPS01097705] Query the plug-in state as soon as possible.

mIsDisplayDevice = SIMHelper.isSmartBookPluggedIn(mContext);

Log.v(TAG, "start, mIsDisplayDevice=" + mIsDisplayDevice);

}

super.start(); // calls createAndAddWindows()

addNavigationBar();

// Lastly, call to the icon policy to install/update all the icons.

mIconPolicy = new PhoneStatusBarPolicy(mContext);

mHeadsUpObserver.onChange(true); // set up

if (ENABLE_HEADS_UP) {

mContext.getContentResolver().registerContentObserver(

Settings.Global.getUriFor(SETTING_HEADS_UP), true,

mHeadsUpObserver);

}

}/span

其中的addNavigationBar()具体的实现方法如下:

span style="font-size:18px;" // For small-screen devices (read: phones) that lack hardware navigation buttons

private void addNavigationBar() {

if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);

if (mNavigationBarView == null) return;

prepareNavigationBarView();

mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());

}/span

可以看到Navigationbar实际上windowmanager向window窗口里添加一个view。在调用addNavigationBar()方法之前会回调start()的父方法super.start()来判断是否要添加NavigationBar。在super.start()的调用父类方法里会调用createAndAddWindows(),该方法内会判断是否需要添加显示NavigationBar,然后决定是否要实例化NavigationBarView.

span style="font-size:18px;"try {

boolean showNav = mWindowManagerService.hasNavigationBar();

if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);

if (showNav) {

mNavigationBarView =

(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);

mNavigationBarView.setDisabledFlags(mDisabled);

mNavigationBarView.setBar(this);

}

} catch (RemoteException ex) {

// no window manager? good luck with that

}/span

WindowManagerService类实现了WindowManagerPolicy的接口,所以WindowManagerService会回调WindowManagerPolicy 的hasNavigationBar()接口,

span style="font-size:18px;" @Override

public boolean hasNavigationBar() {

return mPolicy.hasNavigationBar();

}/span

Policy向下调用实际上调用的是PhoneWindowManager实现的hasNavigationBar方法,下面代码是PhoneWindowManager中的hasNavigationBar()方法。

span style="font-size:18px;"// Use this instead of checking config_showNavigationBar so that it can be consistently

// overridden by qemu.hw.mainkeys in the emulator.

public boolean hasNavigationBar() {

return mHasNavigationBar;

}/span

而mHasNavigationBar的赋值可以在PhoneWindowManager中的setInitialDisplaySize(Display display, int width, int height, int density)方法中找到,

span style="font-size:18px;" if (!mHasSystemNavBar) {

mHasNavigationBar = mContext.getResources().getBoolean(

com.android.internal.R.bool.config_showNavigationBar);

// Allow a system property to override this. Used by the emulator.

// See also hasNavigationBar().

String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");

if (! "".equals(navBarOverride)) {

if (navBarOverride.equals("1")) mHasNavigationBar = false;

else if (navBarOverride.equals("0")) mHasNavigationBar = true;

}

} else {

mHasNavigationBar = false;

}/span

从上面代码可以看到mHasNavigationBar的值的设定是由两处决定的:

1.首先从系统的资源文件中取设定值config_showNavigationBar, 这个值的设定的文件路径是frameworks/base/core/res/res/values/config.xml

!-- Whether a software navigation bar should be shown. NOTE: in the future this may be

autodetected from the Configuration. --

bool name="config_showNavigationBar"false/bool

2.然后系统要获取“qemu.hw.mainkeys”的值,这个值可能会覆盖上面获取到的mHasNavigationBar的值。如果 “qemu.hw.mainkeys”获取的值不为空的话,不管值是true还是false,都要依据后面的情况来设定。

所以上面的两处设定共同决定了NavigationBar的显示与隐藏。

如何实现Android透明导航栏

设置 theme 属性

android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor"

android:theme="@android:style/Theme.Holo.Light.NoActionBar.TranslucentDecor"

android:theme="@android:style/Theme.Holo.NoActionBar.TranslucentDecor"

如果使用自定主题,只需在在 values-19 文件夹下添加以下属性

style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"

!-- API 19 theme customizations can go here. --

item name="android:windowTranslucentStatus"true/item

item name="android:windowTranslucentNavigation"true/item

/style

Android 顶部导航栏

一般的话这个头由四个部分组成,第一个是左边的箭头,这个部分你可以写成一个button,第二个是中间那道竖线,你可以写一条宽度为2dp的竖线,第三个是中间朋友圈那个textview,最后一个依旧是一个button;实现返回很简单啊,给第一个button绑定一个关闭当前Activity的事件监听即可~

Android 目前最流行的 底部导航栏 用什么做的

Tablayout+fragment+RadioGroup。看截图:例子来自android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳

android 怎么实现左侧导航栏

Android左侧推出导航菜单可以让Activity继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计。弹出效果主要使用了translate和alpha样式实现。具体的做法是下列代码:

第一步:设计弹出窗口xml:

Xml代码

?xml version="1.0" encoding="utf-8"?

RelativeLayout

xmlns:android=""

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:orientation="vertical"

LinearLayout

android:id="@+id/pop_layout"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:orientation="vertical"

android:layout_alignParentBottom="true"

android:background="@drawable/btn_style_alert_dialog_background"

Button

android:id="@+id/btn_take_photo"

android:layout_marginLeft="20dip"

android:layout_marginRight="20dip"

android:layout_marginTop="20dip"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="拍照"

android:background="@drawable/btn_style_alert_dialog_button"

android:textStyle="bold"

/

Button

android:id="@+id/btn_pick_photo"

android:layout_marginLeft="20dip"

android:layout_marginRight="20dip"

android:layout_marginTop="5dip"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="从相册选择"

android:background="@drawable/btn_style_alert_dialog_button"

android:textStyle="bold"

/

Button

android:id="@+id/btn_cancel"

android:layout_marginLeft="20dip"

android:layout_marginRight="20dip"

android:layout_marginTop="15dip"

android:layout_marginBottom="15dip"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="取消"

android:background="@drawable/btn_style_alert_dialog_cancel"

android:textColor="#ffffff"

android:textStyle="bold"

/

/LinearLayout

/RelativeLayout

第二步:创建SelectPicPopupWindow类继承PopupWindow:

Java代码

import android.app.Activity;

import android.content.Context;

import android.graphics.drawable.ColorDrawable;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnTouchListener;

import android.view.ViewGroup.LayoutParams;

import android.widget.Button;

import android.widget.PopupWindow;

public class SelectPicPopupWindow extends PopupWindow {

private Button btn_take_photo, btn_pick_photo, btn_cancel;

private View mMenuView;

public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {

super(context);

LayoutInflater inflater = (LayoutInflater) context

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

mMenuView = inflater.inflate(R.layout.alert_dialog, null);

btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);

btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);

btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);

//取消按钮

btn_cancel.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//销毁弹出框

dismiss();

}

});

//设置按钮监听

btn_pick_photo.setOnClickListener(itemsOnClick);

btn_take_photo.setOnClickListener(itemsOnClick);

//设置SelectPicPopupWindow的View

this.setContentView(mMenuView);

//设置SelectPicPopupWindow弹出窗体的宽

this.setWidth(LayoutParams.FILL_PARENT);

//设置SelectPicPopupWindow弹出窗体的高

this.setHeight(LayoutParams.WRAP_CONTENT);

//设置SelectPicPopupWindow弹出窗体可点击

this.setFocusable(true);

//设置SelectPicPopupWindow弹出窗体动画效果

this.setAnimationStyle(R.style.AnimBottom);

//实例化一个ColorDrawable颜色为半透明

ColorDrawable dw = new ColorDrawable(0xb0000000);

//设置SelectPicPopupWindow弹出窗体的背景

this.setBackgroundDrawable(dw);

//mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框

mMenuView.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

int height = mMenuView.findViewById(R.id.pop_layout).getTop();

int y=(int) event.getY();

if(event.getAction()==MotionEvent.ACTION_UP){

if(yheight){

dismiss();

}

}

return true;

}

});

}

}

第三步:编写MainActivity类实现测试:

Java代码

import android.app.Activity;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.TextView;

public class MainActivity extends Activity {

//自定义的弹出框类

SelectPicPopupWindow menuWindow;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView tv = (TextView) this.findViewById(R.id.text);

//把文字控件添加监听,点击弹出自定义窗口

tv.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//实例化SelectPicPopupWindow

menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);

//显示窗口

menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置

}

});

}

//为弹出窗口实现监听类

private OnClickListener itemsOnClick = new OnClickListener(){

public void onClick(View v) {

menuWindow.dismiss();

switch (v.getId()) {

case R.id.btn_take_photo:

break;

case R.id.btn_pick_photo:

break;

default:

break;

}

}

};

}

上述的代码实现了从底部弹出,也可以根据PopupWindow类设置从左下部弹出。

Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:

AlertDialog的位置固定,而PopupWindow的位置可以随意

AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下

showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移

showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移

showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

发表评论

评论列表

  • 听弧渊鱼(2022-07-15 02:43:54)回复取消回复

    m_radio" android:drawableTop="@drawable/bottom_cam" android:gravity

  • 依疚软祣(2022-07-15 04:45:20)回复取消回复

    .showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER

  • 余安雾夕(2022-07-15 01:50:16)回复取消回复

    第三步:编写MainActivity类实现测试:Java代码 import android.app.Activity; import android.os.Bundle; import android.

  • 笙沉傻梦(2022-07-15 08:20:42)回复取消回复

    Style="bold" / Button android:id="@+id/btn_cancel" android:layout_marginLeft="20dip" android:layout_mar