问题
Say I want to set all the EditText fields in my Linear Layout to be single-line, how should I achieve that?
Detailed Code:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
style="@style/LoginTextFieldTheme"
>
<EditText
android:id="@+id/textPassword"
android:layout_weight="1"
android:layout_width="0dp"
android:inputType="textPassword"
android:hint="password"
/>
<EditText
android:id="@+id/textPasswordConfirm"
android:layout_weight="1"
android:layout_width="0dp"
android:inputType="textPassword"
android:hint="password confirm"
/>
</LinearLayout>
I want to specify something in the LoginTextFieldTheme, so that it can make my EditText to be single line.
I searched online, "style" doesn't applied to the child elements of the ViewGroup, and "theme" can be only applied to an activity.
There's something like applying "buttonStyle" to the style which is applied to the ViewGroup, but I cannot find the exact/complete documentation about what to do with the TextEdit.
Thanks a lot.
回答1:
You have few options to achieve this:
1. style.xml
You can apply style to EditText widget.
In
style.xmlin the values folder add this style:<style name="My.EditText.Style" parent="@android:style/Widget.EditText"> <item name="android:singleLine">true</item> </style>And for each
EditTextin your layout add:style="@style/My.EditText.Style"
like:<EditText android:id="@+id/textPassword" style="@style/My.EditText.Style" android:layout_weight="1" android:layout_width="0dp" android:inputType="textPassword" android:hint="password" />
2. Extend EditText
You can extend and create your own custom EditText. Then, you can adjust your widget with singleLine to be true and then use this custom View in your layout.
3. Iterate over ViewGroup
You can iterate by using next ViewIterator over LinearLayout and check by instanceof for EditText and then change any property you need.
public class ViewIterator implements java.util.Iterator<View>
{
private java.util.Stack<View> mNodes;
public ViewIterator(View view)
{
mNodes = new java.util.Stack<View>();
if (view != null)
{
mNodes.push(view);
}
}
public boolean hasNext()
{
return !mNodes.empty();
}
public View next()
{
View view = null;
// if remaining nodes
if (hasNext())
{
// return the last element
view = mNodes.pop();
assert (view != null);
// if it is a container, add its children to the stack
if (view instanceof ViewGroup || view instanceof AdapterView)
{
ViewGroup viewGroup = (ViewGroup)view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
{
assert (viewGroup.getChildAt(i) != null);
mNodes.push(viewGroup.getChildAt(i));
}
}
}
// return result
return view;
}
public void remove()
{
// not supported
}
}
回答2:
to set an edittext to one line you should use in the xml:
android:singleLine="true"
or
android:maxLines="1"
来源:https://stackoverflow.com/questions/18747050/set-childs-style-from-the-viewgroup-in-android