㈠ android开发如何让控件里的文字靠左显示
让android的控件文字靠左显示,需要在xml布局文件中对控件进行设置。
在对应布局文件中,找到该控件。
在gravity属性中设置,android:gravity="left"
效果如图
㈡ android怎么根据定义好的xml文件,动态生成控件
使用XML解析器,将控件对象解析出来,再根据解析出来的内容利用反射生成相应的控件,然后添加到Activity中。不过控件的名字要是Android 标准的名称,或者是继承了标准控件的子类名。
㈢ 在android中如何让布局页面选择性显示控件
你可以在一个linearlayout里include两个layout,一个隐藏,一个显示,然后点击button后隐藏当前的layout,显示另外一个
㈣ Android中有没有比Spinner控件更好的选择
可以使用Button加ListPopupWindow实现和spinner一样的效果,并且可以监听到点击事件(Spinner是不能设置点击事件的)
布局文件,只有一个button
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"><Buttonandroid:id="@+id/button"android:layout_width="100dp"android:layout_height="50dp"/></LinearLayout>
代码
{privateButtonbutton;;privateList<String>strings;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);strings=newArrayList<String>();strings.add("item1");strings.add("item2");strings.add("item3");button=(Button)findViewById(R.id.button);popupWindow=newListPopupWindow(this);popupWindow.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,strings));popupWindow.setAnchorView(button);popupWindow.setWidth(LayoutParams.WRAP_CONTENT);popupWindow.setHeight(LayoutParams.WRAP_CONTENT);popupWindow.setModal(true);popupWindow.setOnItemClickListener(newOnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){//TODOAuto-generatedmethodstubbutton.setText(strings.get(position));popupWindow.dismiss();}});button.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){popupWindow.show();}});}}
运行效果
㈤ android 在普通的java文件中如何获取布局中的控件
你是通过哪种方式自定义的AlterDialog呢?如果是用了AlertDialog.Builder的setView方法,那你之前应版该调用过Inflater吧,这时候你已经实权例化了alter_dlalog.xml得到了一个view,用这个view.findViewById就行。
㈥ 从源码中浅析Android中怎么利用attrs和styles定义控件
1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性你可以找到attrs.xml这个文件,打开它,全选,右键->Show In->OutLine。可以看到整个文件的解构我们大概可以看出里面是Android中的各种属性的声明,比如textStyle这个属性是这样定义的:Java代码 <!– Default text typeface style. –> <attr name="textStyle"> <flag name="normal" value="0" /> <flag name="bold" value="1" /> <flag name="italic" value="2" /> </attr> 那么现在你知道,我们在写android:textStyle的时候为什么会出现normal,bold和italic这3个东西了吧,就是定义在这个地方。再看看textColor:Java代码 <!– Color of text (usually same as colorForeground). –> <attr name="textColor" format="reference|color" /> format的意思是说:这个textColor可以以两种方式设置,要么是关联一个值,要么是直接设置一个颜色的RGB值,这个不难理解,因为我们可以平时也这样做过。 也就是说我们平时在布局文件中所使用的各类控件的属性都定义在这里面,那么这个文件,除了定义这些属性外还定义了各种具体的组件,比如TextView,Button,SeekBar等所具有的各种特有的属性比如SeekBar: Java代码 <declare-styleable name="SeekBar"> <!– Draws the thumb on a seekbar. –> <attr name="thumb" format="reference" /> <!– An offset for the thumb that allows it to extend out of the range of the track. –> <attr name="thumbOffset" format="dimension" /> </declare-styleable> 也许你会问SeekBar的background,等属性怎么没有看到?这是因为Android中几乎所有的组件都是从View中继承下来的,SeekBar自然也不例外,而background这个属性几乎每个控件都有,因此被定义到了View中,你可以在declare-styleable:View中找到它。 总结下,也就是说attrs.xml这个文件定义了布局文件中的各种属性attr:***,以及每种控件特有的属性declare-styleable:*** 2.styles.xml:刚才的attrs.xml定义的是组件的属性,现在要说的style则是针对这些属性所设置的值,一些默认的值。这个是SeekBar的样式,我们可以看到,这里面设置了一个SeekBar的默认的样式,即为attrs.xml文件中的各种属性设置初始值Java代码 <style name="Widget.SeekBar"> <item name="android:indeterminateOnly">false</item> <item name="android:progressDrawable">@android:drawable/progress_horizontal</item> <item name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item> <item name="android:minHeight">20dip</item> <item name="android:maxHeight">20dip</item> <item name="android:thumb">@android:drawable/seek_thumb</item> <item name="android:thumbOffset">8dip</item> <item name="android:focusable">true</item> </style> 这个是Button的样式:Java代码 <style name="Widget.Button"> <item name="android:background">@android:drawable/btn_default</item> <item name="android:focusable">true</item> <item name="android:clickable">true</item> <item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item> <item name="android:textColor">@android:color/primary_text_light</item> <item name="android:gravity">center_vertical|center_horizontal</item> </style> 有了属性和值,但是这些东西是如何关联到一起的呢?它们如何被android的framework层所识别呢? 3.组件的源码我们看下TextView的源码:Java代码 public TextView(Context context) { this(context, null); }//这个构造器用来给用户调用,比如new TextView(this); public TextView(Context context, AttributeSet attrs) { this(context, attrs, com.android.internal.R.attr.textViewStyle); } public TextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);//为用户自定义的TextView设置默认的style mText = ""; //设置画笔 mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); mTextPaint.density = getResources().getDisplayMetrics().density; mTextPaint.setCompatibilityScaling( getResources().getCompatibilityInfo().applicationScale); mHighlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mHighlightPaint.setCompatibilityScaling( getResources().getCompatibilityInfo().applicationScale); mMovement = getDefaultMovementMethod(); mTransformation = null; //attrs中包含了这个TextView控件在布局文件中定义的属性,比如android:background,android:layout_width等 //com.android.internal.R.styleable.TextView中包含了TextView中的针对attrs中的属性的默认的值 //也就是说这个地方能够将布局文件中设置的属性获取出来,保存到一个TypeArray中,为这个控件初始化各个属性 TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.TextView, defStyle, 0); int textColorHighlight = 0; ColorStateList textColor = null; ColorStateList textColorHint = null; ColorStateList textColorLink = null; int textSize = 15; int typefaceIndex = -1; int styleIndex = -1; /* * Look the appearance up without checking first if it exists because * almost every TextView has one and it greatly simplifies the logic * to be able to parse the appearance first and then let specific tags * for this View override it. */ TypedArray appearance = null; //TextView_textAppearance不太了解为什么要这样做?难道是为了设置TextView的一些默认的属性? int ap = a.getResourceId(com.android.internal.R.styleable.TextView_textAppearance, -1); if (ap != -1) { appearance = context.obtainStyledAttributes(ap, com.android.internal.R.styleable. TextAppearance); } if (appearance != null) { int n = appearance.getIndexCount(); for (int i = 0; i < n; i++) { int attr = appearance.getIndex(i); switch (attr) { case com.android.internal.R.styleable.TextAppearance_textColorHighlight: textColorHighlight = appearance.getColor(attr, textColorHighlight); break; case com.android.internal.R.styleable.TextAppearance_textColor: textColor = appearance.getColorStateList(attr); break; case com.android.internal.R.styleable.TextAppearance_textColorHint: textColorHint = appearance.getColorStateList(attr); break; case com.android.internal.R.styleable.TextAppearance_textColorLink: textColorLink = appearance.getColorStateList(attr); break; case com.android.internal.R.styleable.TextAppearance_textSize: textSize = appearance.getDimensionPixelSize(attr, textSize); break; case com.android.internal.R.styleable.TextAppearance_typeface: typefaceIndex = appearance.getInt(attr, -1); break; case com.android.internal.R.styleable.TextAppearance_textStyle: styleIndex = appearance.getInt(attr, -1); break; } } appearance.recycle(); } //各类属性 boolean editable = getDefaultEditable(); CharSequence inputMethod = null; int numeric = 0; CharSequence digits = null; boolean phone = false; boolean autotext = false; int autocap = -1; int buffertype = 0; boolean selectallonfocus = false; Drawable drawableLeft = null, drawableTop = null, drawableRight = null, drawableBottom = null; int drawablePadding = 0; int ellipsize = -1; boolean singleLine = false; int maxlength = -1; CharSequence text = ""; CharSequence hint = null; int shadowcolor = 0; float dx = 0, dy = 0, r = 0; boolean password = false; int inputType = EditorInfo.TYPE_NULL; int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); //通过switch语句将用户设置的,以及默认的属性读取出来并初始化 switch (attr) { case com.android.internal.R.styleable.TextView_editable: editable = a.getBoolean(attr, editable); break; case com.android.internal.R.styleable.TextView_inputMethod: inputMethod = a.getText(attr); break; case com.android.internal.R.styleable.TextView_numeric: numeric = a.getInt(attr, numeric); break; //更多的case语句… case com.android.internal.R.styleable.TextView_textSize: textSize = a.getDimensionPixelSize(attr, textSize);//设置当前用户所设置的字体大小 break; case com.android.internal.R.styleable.TextView_typeface: typefaceIndex = a.getInt(attr, typefaceIndex); break; //更多的case语句… } 通过上面的代码大概可以知道,每个组件基本都有3个构造器,其中只传递一个Context上下文的那个构造器一般用来在java代码中实例化使用。比如你可以Java代码 TextView tv = new TextView(context); 来实例化一个组件。 最终调用的是第3个构造器Java代码 public TextView(Context context, AttributeSet attrs, int defStyle) 在这个构造器中为你设置了默认的属性attrs和值styles。关键不在这里,而是后面通过使用下面的代码Java代码 TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.TextView, defStyle, 0); 来将属性和值获取出来,放到一个TypeArray中,然后再利用一个switch语句将里面的值取出来。再利用这些值来初始化各个属性。这个View最终利用这些属性将这个控件绘制出来。如果你在布局文件中定义的一个View的话,那么你定义的值,会被传递给构造器中的attrs和styles。也是利用同样的方式来获取出你定义的值,并根据你定义的值来绘制你想要的控件。再比如其实Button和EditText都是继承自TextView。看上去两个控件似乎差异很大,其实不然。Button的源码其实相比TextView变化的只是style而已:
㈦ android怎么根据定义好的xml文件,动态生成控件
使用XML解析器,将控件对象解析出来,再根据解析出来的内容利用反射生成相应的控件,然后添加到Activity中。不过控件的名字要是Android 标准的名称,或者是继承了标准控件的子类名。
㈧ android 布局文件中 控件属性哪些是必须的哪些是可选的啊
一般用可视化设置控件后,再打开布局xml文件,里面有的属性都是必须得属性。宽和高当然是必须的,用可视化设置布局后,宽高都是默认值,也可以写死。
㈨ android在指定布局文件动态生成控件
package zcy.com;
import android.app.Activity;import android.os.Bundle;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;
public class Show extends Activity { private Button btNext; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.show1); btNext=(Button)findViewById(R.id.next); btNext.setOnClickListener(new Button.OnClickListener(){ public void onClick(View view){//创建一个布局管理器控件 LinearLayout linearLayout=new LinearLayout(Show.this); setContentView(linearLayout);//设置orientation为horizontal,1表示为vertical linearLayout.setOrientation(0); TextView tvSecond=new TextView(Show.this); tvSecond.setText("这是Android奉献给你的第二个页面"); Button btNext2=new Button(Show.this); btNext2.setText("下一步"); btNext2.setId(2); LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); linearLayout.addView(tvSecond,lp1); linearLayout.addView(btNext2,lp1); btNext2.setOnClickListener(new OnClickListener(){ public void onClick(View view){ //这次只放置一个TextView不需要布局管理器 TextView tv3=new TextView(Show.this); tv3.setText("恭喜你已来到最后一个页面!");//直接让页面显示一个TextView setContentView(tv3); } }); } }); }}
这里涉及到几个类的构造函数和方法,我把Android SDK文档中的内容直接引用过来:
Public Constructors
LinearLayout(Context context)
LinearLayout(Context context, AttributeSet attrs)
public void setOrientation (int orientation)
Should the layout be a column or a row.
Related XML Attributes
android:orientation
Parameters orientation Pass HORIZONTAL or VERTICAL. Default value is HORIZONTAL.
ConstantValueDescription
horizontal0 Defines an horizontal widget.
vertical1 Defines a vertical widget.
This corresponds to the global attribute resource symbol orientation.
Public Constructors
LinearLayout.LayoutParams(Context c, AttributeSet attrs)
LinearLayout.LayoutParams(int width, int height)
addView方法的定义在ViewGroup类中
//Adds a child view with the specified layout parameters.
voidaddView(View child, ViewGroup.LayoutParams params)
//Adds a child view with the specified layout parameters.
void addView(View child, int index, ViewGroup.LayoutParams params)
看一下这里的继承关系:
另外注意,为什么在传递Context参数时必须用Show.this而不能直接用this呢?因为此时我们已经进入了一个匿名类new Button.OnClickListener()中,虽然这个匿名类还是在Show类,但是我们的代码已经不再“直属”于Show类了。