如何将 TextInputLayout 与 Theme.material 一起使用?
Posted
技术标签:
【中文标题】如何将 TextInputLayout 与 Theme.material 一起使用?【英文标题】:How to use TextInputLayout with Theme.material? 【发布时间】:2017-01-19 20:25:41 【问题描述】:我正在尝试将 TextInputLayout 与 Theme.material 一起使用,代码看起来像......
activity_mail.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
xmlns:drawableLeft="http://schemas.android.com/apk/res-auto"
android:background="#2196F3"
android:orientation="vertical"
android:scrollbarAlwaysDrawVerticalTrack="true"
tools:context="com.realmilk.MainActivity">
<TextView
android:id="@+id/login_title"
android:layout_
android:layout_
android:layout_marginBottom="16dp"
android:layout_marginTop="22dp"
android:gravity="center_horizontal"
android:text="Account Login"
android:textColor="#fff"
android:textSize="26sp"
android:textStyle="bold" />
<RelativeLayout
android:layout_
android:layout_
android:layout_below="@+id/login_title"
android:layout_marginTop="70dp"
android:background="#fff"
android:elevation="4dp"
android:orientation="vertical"
android:padding="20dp">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:paddingTop="30dp">
<android.support.design.widget.TextInputLayout
android:layout_
android:layout_>
<EditText
android:layout_
android:layout_
android:drawableLeft="@drawable/ic_supervisor_account_black_24dp"
android:drawableTint="#FF4081"
android:singleLine="true"
android:hint="User Name"
android:inputType="textEmailAddress" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_
android:layout_>
<EditText
android:layout_
android:layout_
android:layout_marginTop="16dp"
android:singleLine="true"
android:drawableLeft="@drawable/ic_lock_black_24dp"
android:drawableTint="#FF4081"
android:hint="Password"
android:inputType="numberPassword" />
</android.support.design.widget.TextInputLayout>
<TextView
android:layout_
android:layout_
android:layout_gravity="right"
android:paddingTop="5dp"
android:text="Forgot Password?" />
<Button
android:layout_
android:layout_
android:layout_margin="22dp"
android:background="#d67601"
android:text="Sign in"
android:textAllCaps="false"
android:textColor="#fff"
android:textSize="18sp" />
</LinearLayout>
</RelativeLayout>
<ImageButton
android:id="@+id/user_profile_photo"
android:layout_
android:layout_
android:layout_below="@+id/login_title"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:background="@drawable/user_profile_image_background"
android:elevation="4dp" />
</RelativeLayout>
MainActivity 看起来像这样..
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
当我尝试执行此操作时
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:343)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:312)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:277)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at com.realmilk.MainActivity.onCreate(MainActivity.java:11)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
这是在我观察到的控制台上。
谁能帮我找出我错的地方。
【问题讨论】:
请发布您的style.xml
使用Theme.AppCompat
主题有什么问题?
更改以下文件
style.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
colors.xml
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#1a237e</color>
<color name="transparent">@android:color/transparent</color>
<color name="colorAccent">#FF4081</color>
<color name="windowBackground">#313131</color>
</resources>
您可以根据需要更改颜色。
Androidmanifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
//your activities
</application>
希望这会有所帮助...
【讨论】:
我无法使用 我正在寻找标准材质设置。 你可以查看这个material tutorial【参考方案2】:TextInputLayout 是support
库的一部分(如您所见,它是设计库的一部分)。支持库中的所有支持组件都被编写为与其他支持组件(如主题)互补。在这种情况下,您需要使用Theme.AppCompat
。但别担心,所有的兼容 UI 元素都是为支持较旧的 Android 版本而构建的,但如果您使用应用兼容主题,它会自动使用 Material 主题实现在您的应用中生成 UI。
总结一下:你必须Theme.AppCompat
但它等于Android OS 中的Material Theme >= 5.0
只需使用:
<style name="AppTheme" parent="Theme.AppCompat">
而不是标准材质。
【讨论】:
以上是关于如何将 TextInputLayout 与 Theme.material 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在新的 android 设计库中使用 TextInputLayout
如何在 TextInputLayout 中水平居中“标签提示”?
prefixtext 更改 textInputlayout 高度并使其变得巨大