android编程 能不能在xml中设置控件宽度为父窗口的一半

android编程 能不能在xml中设置控件宽度为父窗口的一半,第1张

可以的。

用一下代表实现:

1 import androidwidgetEditText;

2 import androidwidgetImageButton;

3 import androidwidgetImageView;

4 import androidwidgetLinearLayout;

5 import androidwidgetPopupWindow;

6 import androidwidgetRadioButton;

7 import androidwidgetRadioGroup;

8 import androidwidgetRelativeLayout;

9 import androidwidgetSeekBar;  

10 import androidwidgetCompoundButtonOnCheckedChangeListener;

11 import androidwidgetSeekBarOnSeekBarChangeListener;

12 import androidwidgetTextView;

13 import androidwidgetToast;

14 import androidwidgetViewSwitcher;

Android Support Library 232里的 Design Support Library新加了一个Bottom Sheets控件,Bottom Sheets顾名思义就是底部 *** 作控件,用于在屏幕底部创建一个可滑动关闭的视图,可以替代对话框和菜单。

其中包含BottomSheets、BottomSheetDialog和BottomSheetDialogFragment三种可以使用。其中应用较多的控件是BottomSheetDialog,主要运用在界面底部分享列表,评论列表等,最近在知乎评论列表界面看到知乎和今日头条运用到了这个效。

本文实现效果如下:

BottomSheetDialog可以替代大多数网格显示和列表展示的dialog和popupwindow,默认宽度撑满,并且在BottomSheetDialog 区域中向下滑动也让对话框消失。

gitHub地址: >

按照API和网上的例子,制作了一个popupWindow的demo。

但是popupWindow就是不显示。

后来发现必须设置popupWindow的宽度和高度,不然是显示不出来的

以为popupWindow绑定自定义的View就可以了,还要设置高度和宽度

setContentView(view);

setWidth(LayoutParamsWRAP_CONTENT);

setHeight(LayoutParamsWRAP_CONTENT);

最近项目中接触到接口回调,以及Androidd窗PopWindow组件的使用,现在利用学到的知识自己写了一个简单的Demo,练习下在Android下如何运用接口回调,来实现d窗PopWindow的功能。

1 定义一个接口:OnSelectItemListener。定义一个方法 void selectItem(String name, int type),作为点击d窗的每个Item的回调接口。

2 自定义d窗类:MyPopupWindow,其布局文件为popup_windowxml。当在MainActivity调用其构造函数创建对象时,同时执行initPopupWindow()函数,给每个Item设置监听器,监听点击Item时,回调接口函数selectItem("Pop Window A", POP_WINDOW_ITEM_1),该函数在MainActivity中实现。

3 主Activity: MainActivity。其布局文件为一个Button和一个TextView。监听Button,每当点击则d出PopWindow,呈现三个Item。调用MyPopupWindow类中的方法setOnSelectItemListener(OnSelectItemListener listener),传入OnSelectItemListener 对象作为参数,同时实现回调接口OnSelectItemListener的方法void selectItem(String name, int type)。

主Activity: MainActivity Java

[java] view plain copy

packagecomlambdroidcallbacktest2;

importandroidappActivity;

importandroidcontentContext;

importandroidosBundle;

importandroidviewView;

importandroidwidgetButton;

importandroidwidgetTextView;

importandroidwidgetToast;

//联系接口的回调以及PopWindowd窗的简单使用

publicclassMainActivityextendsActivity {

privateMyPopupWindow myPopupWindow;

privateButton btn_pop_window;

privateTextView tv_display;

protectedContext context;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

context =this;

btn_pop_window = (Button) findViewById(Ridbtn_pop_window);

tv_display = (TextView) findViewById(Ridtv_display);

//给Button设置事件监听:d出d窗

btn_pop_windowsetOnClickListener(newViewOnClickListener() {

@Override

publicvoidonClick(View v) {

myPopupWindowshow(btn_pop_window);

}

});

myPopupWindow =newMyPopupWindow(context);

//实现OnSelectItemListener接口的selectItem方法:对于d窗三个Item的事件监听

myPopupWindowsetOnSelectItemListener(newOnSelectItemListener() {

@Override

publicvoidselectItem(String name,inttype) {

//点击电站列表,d出d框

if(myPopupWindow !=null&& myPopupWindowisShowing()) {

myPopupWindowdismiss();

}

tv_displaysetText(name);

switch(type){

caseMyPopupWindowPOP_WINDOW_ITEM_1:

ToastmakeText(context,"我是d窗A, 我的英文名是"+ name, ToastLENGTH_SHORT)show();

break;

caseMyPopupWindowPOP_WINDOW_ITEM_2:

ToastmakeText(context,"我是d窗B, 我的英文名是"+ name, ToastLENGTH_SHORT)show();

break;

caseMyPopupWindowPOP_WINDOW_ITEM_3:

ToastmakeText(context,"我是d窗C, 我的英文名是"+ name, ToastLENGTH_SHORT)show();

break;

default:

break;

}

}

});

}

}

activity_mainxml

[html] view plain copy

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/btn_pop_window"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_margin="20dp"

android:padding="20dp"

android:text="Pop Window"

android:textSize="20sp"/>

android:id="@+id/tv_display"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginTop="10dp"

android:gravity="center"

android:text="Hello World!"

android:textSize="30sp"/>

自定义d窗类:MyPopupWindowjava

[java] view plain copy

packagecomlambdroidcallbacktest2;

importandroidappActionBar;

importandroidcontentContext;

importandroidgraphicsdrawableColorDrawable;

importandroidviewLayoutInflater;

importandroidviewView;

importandroidwidgetLinearLayout;

importandroidwidgetPopupWindow;

publicclassMyPopupWindowimplementsViewOnClickListener{

privatePopupWindow mPopWindow;

privateContext mContext;

privateLinearLayout llPop1;

privateLinearLayout llPop2;

privateLinearLayout llPop3;

privateintpw_height;

publicstaticfinalintPOP_WINDOW_ITEM_1 =1;

publicstaticfinalintPOP_WINDOW_ITEM_2 =2;

publicstaticfinalintPOP_WINDOW_ITEM_3 =3;

privateOnSelectItemListener listener;

publicvoidsetOnSelectItemListener(OnSelectItemListener listener){

thislistener = listener;

}

publicMyPopupWindow(Context context){

mContext = context;

initPopupWindow();//初始化d窗

}

publicvoidinitPopupWindow(){

View view = LayoutInflaterfrom(mContext)inflate(Rlayoutpopup_window,null);

mPopWindow =newPopupWindow(view, ActionBarLayoutParamsWRAP_CONTENT, ActionBarLayoutParamsWRAP_CONTENT,true);

mPopWindowsetOutsideTouchable(true);

/ 为其设置背景,使得其内外焦点都可以获得 /

mPopWindowsetBackgroundDrawable(newColorDrawable());

mPopWindowsetFocusable(true);

pw_height = viewgetHeight();

llPop1 = (LinearLayout) viewfindViewById(Ridll_pop_1);

llPop1setOnClickListener(this);

llPop2 = (LinearLayout) viewfindViewById(Ridll_pop_2);

llPop2setOnClickListener(this);

llPop3 = (LinearLayout) viewfindViewById(Ridll_pop_3);

llPop3setOnClickListener(this);

}

//监听三个d窗的点击事件

@Override

publicvoidonClick(View v) {

switch(vgetId()){

caseRidll_pop_1:

if(listener !=null) {

listenerselectItem("Pop Window A", POP_WINDOW_ITEM_1);//回调接口

}

break;

caseRidll_pop_2:

if(listener !=null) {

listenerselectItem("Pop Window B", POP_WINDOW_ITEM_2);

}

break;

caseRidll_pop_3:

if(listener !=null) {

listenerselectItem("Pop Window C", POP_WINDOW_ITEM_1);

}

break;

default:

break;

}

}

//显示d窗,并设置d窗基于标题栏的显示位置

publicvoidshow(View view) {

//popupwindow相对view位置x轴偏移量

View viewTemp = mPopWindowgetContentView();

viewTempmeasure(0,0);

intwidth = viewTempgetMeasuredWidth();

intxOffset = (viewgetWidth() - width) /2;

mPopWindowshowAsDropDown(view, xOffset,0);

}

/

 退出popupwindow

/

publicvoiddismiss() {

if(mPopWindow !=null&& mPopWindowisShowing()) {

mPopWindowdismiss();

}

}

/

 popupwindow是否正在显示

/

publicbooleanisShowing() {

if(mPopWindow !=null) {

returnmPopWindowisShowing();

}

returnfalse;

}

}

popup_windowxml

[html] view plain copy

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/ll_alarm_type"

android:layout_width="120dp"

android:layout_height="130dp"

android:orientation="vertical"

android:background="@drawable/popupwindow"

android:paddingBottom="16dp"

android:paddingTop="16dp">

android:id="@+id/ll_pop_1"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_marginTop="5dp"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 A"

android:textSize="15sp"

android:textColor="#ffffff"/>

android:id="@+id/ll_pop_2"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 B"

android:textSize="15sp"

android:textColor="#ffffff"/>

android:id="@+id/ll_pop_3"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:layout_gravity="center_horizontal"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="窗口 C"

android:textSize="15sp"

android:textColor="#FFFFFF"/>

回调接口:OnSelectItemListener

[java] view plain copy

packagecomlambdroidcallbacktest2;

publicinterfaceOnSelectItemListener {

voidselectItem(String name,inttype);

}

点击Button,d出d窗,显示三个Item

点击第二个Item,通过回调函数,来实现TextView内容的修改,以及d出Toast

总结

Java回调情形涉及很多,本文属于接口的异步回调:当不知道何时会执行接口的回调函数,(通过接口回调来对获取到的资源的 *** 作)。除此还有线程间的异步回调(子线程进行耗时 *** 作, *** 作完毕通知主线程或将数据传给主线程处理),以及利用接口回调来实现线程间的数据通信等等(Android可以利用Handler来实现)。等下次再举例说明Java回调函数的其它情形。

PopupWindow 的这两个方法都是控制PopupWindow 出现的,具体分析如下:

1showAtLocation,例如:showAtLocation(findViewById(Ridsearch_ib), GravityTOP | GravityRIGHT,10, 10);

第一个参数:这个view是要能获取到window唯一标示的(也就是只要能获取到window 标示,view是什么控件都可以),应该是标示这个pw添加到哪个window里面,对控制pw出现位置没有影响;

第二个参数:请记住屏幕原点是屏幕的左上角。GravityTOP | GravityRIGHT指的就是屏幕的右上角,那么pw的中心点坐标是(屏幕宽,0)。pw默认是在屏幕的中间,也就是GravityLEFT表示pw的中心点坐标是(0,1/2屏幕高);

第三、四个参数:偏移量的方向与第二个参数有关。GravityTOP | GravityRIGHT,以屏幕右上角为原点,pw往X轴负方向偏移10个像素,往Y轴正方向偏移10个像素;如果是GravityBOTTOM| GravityLEFT,以屏幕左下角为原点,pw往X轴正方向偏移10个像素,往Y轴正方向偏移10个像素。

注意:这个偏移量可以是正的,也可以是负的。无论偏移多大,pw是不会跑出屏幕。具体往轴的那个方向偏移,跟第二个参数有关,对于GravityCENTER的情况,偏移量负表示往轴的负方向,正往轴的正方向

2showAsDropDown,例如:showAsDropDown(MainActivitythisfindViewById(Ridlogo_iv),100,0),

以Ridlogo_iv的左下角为原点,向X轴正方向偏移100个像素,Y轴方向偏移0个像素。

注意:这个偏移量可以是正的,也可以是负的。无论偏移多大,pw是不会跑出屏幕。

1、含义

Popwindow就是Android上自定义的一个d出窗口,是在当前activity的顶部的,可以在任意的位置显示,在显示的时候会阻塞UI线程。

2、构造

Popwindow可以直接通过构造方法获取

new PopupWindow(View contentView,intwidth,intheight,booleanfocusable)

构造方法有很多,但是要确保contentview ,width,hight的设置,否则Popwindow不会显示任何内容

这些参数也都可以单独进行设置,比如 popwindowsetContentView(contentView);

3、解析

popwindow的难点就在于这几个参数的设置,一般容易使人迷惑。

popupWindow1setFocusable(true);//获取焦点

popupWindow1setOutsideTouchable(true);//获取外部触摸事件

popupWindow1setTouchable(true);//能够响应触摸事件

popupWindow1setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

关于背景的设置

popupWindow1setFocusable(true);//获取焦点

popupWindow1setOutsideTouchable(true);//获取外部触摸事件

popupWindow1setTouchable(true);//能够响应触摸事件

//popupWindow1setBackgroundDrawable(new ColorDrawable(0x8f000000));//设置背景

一般情况,如果前面几个设置都设置为true,而且果设置了背景的话,那么你按back键和点击d窗外的区域能使d窗消失,如果不设置背景的话,则不会有这样的效果,即使你设置了popupWindowsetOutsideTouchable(true)。

那么这是为什么呢?别人这里已经有完整的解答,就不再赘述了。

详情见: >

你好!

调用显示的时候用showAtLocation,然后第二个参数选择Gravitycenter,第三个第四个写0,就可以居中了

获取屏幕的宽高,分别乘08,然后设置popupWindow的width、height就可以不贴屏幕了,刚测试可行 。

点击时 先将悬浮窗位置移动到中央 再从中央d出!

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

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

Xml代码

<xml version="10" encoding="utf-8">

<RelativeLayout

xmlns:android=">

以上就是关于android编程 能不能在xml中设置控件宽度为父窗口的一半全部的内容,包括:android编程 能不能在xml中设置控件宽度为父窗口的一半、BottomSheetDialog控件使用、popupwindow不显示怎么回事等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9303502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存