Android Studio 0.4.5
用于创建自定义对话框的Android文档:http://developer.android.com/guide/topics/ui/dialogs.html
如果需要自定义对话框,则可以将“活动”显示为对话框而不是使用“对话框API”。只需创建一个活动并将其主题设置为Theme.Holo.Dialog in
<activity>
清单元素:
<activity android:theme="@android:style/Theme.Holo.Dialog" >
然而,当我尝试这个时,我得到以下异常:
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity
我支持以下内容,我不能使用大于10的内容:
minSdkVersion 10
targetSdkVersion 19
在我的风格中,我有以下内容:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
在我的清单中,我有这个活动:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:theme="@android:style/Theme.Holo.Light.Dialog"
android:name="com.ssd.register.Dialog_update"
android:label="@string/title_activity_dialog_update" >
</activity>
我正在努力创建像这样的对话框,因为我已经完成了布局。
有谁能告诉我如何解决这个问题?
答案 0 :(得分:1048)
您遇到此问题的原因是您尝试应用对话框主题的活动正在扩展ActionBarActivity
,这需要应用AppCompat
主题。
更新:扩展AppCompatActivity
也会出现此问题
在这种情况下,将Java继承从ActionBarActivity
更改为Activity
,并将对话框主题保留在清单中,非Theme.AppCompat
值
一般规则是,如果您希望代码支持旧版Android,则应该具有AppCompat
主题,并且Java代码应该扩展AppCompatActivity
。如果你有一个不需要这种支持的活动,比如你只关心Android的最新版本和功能,你可以应用任何主题,但java代码必须扩展普通的Activity
。 / p>
注意:从AppCompatActivity
(或子类,ActionBarActivity
)更改为Activity
时,还必须将具有“支持”的各种呼叫更改为相应的呼叫 “支持”。因此,请拨打getSupportFragmentManager
。
getFragmentManager
答案 1 :(得分:509)
您需要做的只是将android:theme="@style/Theme.AppCompat.Light"
添加到AndroidManifest.xml
文件中的应用标记。
答案 2 :(得分:227)
在上面的评论中从@MarkKeen复制答案,因为我遇到了同样的问题。
我在帖子顶部说明了错误,并且在我添加了警告对话框后发生了。我在清单中有所有相关的样式信息。通过更改警报构建器中的上下文引用来解决我的问题 - 我更改了:
new android.support.v7.app.AlertDialog.Builder(getApplicationContext())
到:
new android.support.v7.app.AlertDialog.Builder(this)
没有更多问题。
答案 3 :(得分:89)
min sdk是10. ActionBar
可从api级别11获得。因此对于10,您将使用支持库中的AppCompat
,您需要使用Theme.AppCompat
或其后代同样的。
使用
android:theme="@style/Theme.AppCompat" >
或者,如果您不想在顶部使用操作栏
android:theme="@style/Theme.AppCompat.NoActionBar">
更多信息@
http://developer.android.com/guide/topics/ui/actionbar.html
编辑:
我可能误读了操作帖。
似乎操作需要带有活动主题的Dialog。正如Bobbake4已经建议的那样,Activity
而不是ActionBarActivity
。
还可以在下面的链接中查看@ Dialog属性
答案 4 :(得分:73)
这对我有用,我刚刚改变了:
final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
到此:
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
答案 5 :(得分:38)
我遇到了这个问题,即使我的主题是AppCompat
主题,而我的活动是AppCompatActivity
(或Activity
,正如其他人的答案所示。所以我清理,重建并重新运行项目。
( Build - &gt; Clean Project; Build - &gt; Rebuild Project; Run - &gt; Run )
看似愚蠢,但现在效果很好!
希望它有所帮助!
答案 6 :(得分:24)
这就是为我解决的问题:我没有在清单中指定主题,而是在onCreate
为每个扩展ActionBarActivity
的活动定义了它:
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.MyAppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity_layout);
...
}
此处MyAppTheme
是Theme.AppCompat
的后代,并以xml定义。请注意,必须在super.onCreate
和setContentView
之前设置主题。
答案 7 :(得分:19)
转到你的风格并把父母
parent="Theme.AppCompat"
而不是
parent="@android:style/Theme.Holo.Light"
答案 8 :(得分:16)
在我的情况下,我的res目录中没有values-v21文件。然后我创建了它并在代码中添加了它:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
答案 9 :(得分:13)
更改所需活动的主题。这对我有用:
<activity
android:name="HomeActivity"
android:screenOrientation="landscape"
android:theme="@style/Theme.AppCompat.Light"
android:windowSoftInputMode="stateHidden" />
答案 10 :(得分:13)
如果您需要在style.xml上扩展ActionBarActivity:
var currentPage = window.location.pathname.substring(1);
$('.tabs a').each(function(index, $tag){
var link = $tag.attr('href');
if(link === currentPage) {
$('span', $tag).addClass('active');
}
});
如果您将应用程序的主题设置为android:Theme.Material.Light而不是 AppTheme.Base ,那么您将获得“IllegalStateException:您需要使用Theme.AppCompat主题(或后代)此活动“错误。
答案 11 :(得分:12)
我在三星设备上发生了这样的崩溃,即使该活动确实使用了 Theme.AppCompat 。 根本原因与三星方面的奇怪优化有关:
- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme
我的解决方案是删除android:launchMode="singleTask"
答案 12 :(得分:12)
就做
new AlertDialog.Builder(this)
代替
new AlertDialog.Builder(getApplicationContext())
答案 13 :(得分:12)
我有同样的问题,但是当我把它放在清单上时它解决了:android:theme =&#34; @ style / Theme.AppCompat。
{{1}}
答案 14 :(得分:7)
确保在创建新的警报对话框时使用的是活动上下文,而不是应用程序或基本上下文。
答案 15 :(得分:7)
对我来说是使用ContextThemeWrapper的解决方案:
private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}
答案 16 :(得分:6)
你有很多解决这个错误的方法。
您应该使用活动或 FragmentActivity 而不是 ActionbarActivity 或 AppCompatActivity
< / LI>如果要使用 ActionbarActivity 或 AppCompatActivity ,则应更改 styles.xml Theme.Holo.xxxx 到 Theme.AppCompat.Light (如有必要,添加到 DarkActionbar )
如果您不需要有关操作栏或 AppCompat 的高级属性,则不需要使用操作栏或 AppCompat
答案 17 :(得分:6)
就我而言,当我尝试显示Dialog时出现了此类问题。 问题出在上下文中,我使用了 getBaseContext(),从理论上讲应该返回Activity上下文,但是看起来不是,而是在应用任何Theme之前返回上下文。
所以我只是将 getBaseContexts()替换为“ 此”,现在它可以正常工作了。
Dialog.showAlert(this, title, message,....);
答案 18 :(得分:6)
在Android清单中,只需将活动主题更改为AppTheme,如下面的代码段
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme">
</activity>
答案 19 :(得分:6)
将主题样式父级更改为
parent="Theme.AppCompat"
这对我有用......
答案 20 :(得分:6)
我也有这个问题以及我做了什么来修复它,并且仍然使用Holo主题是采取以下步骤:
首先我替换了这个导入:
import android.support.v7.app.AppCompatActivity;
这一个:
import android.app.Activity;
然后改变我的扩展名:
public class MyClass extends AppCompatActivity {//...
到此:
public class MyClass extends Activity {//...
还必须更改此导入:
import android.support.v7.app.AlertDialog;
到这个导入:
import android.app.AlertDialog;
然后您可以在活动级别的清单中使用主题标记:
android:theme="@android:style/Theme.Holo.Dialog" />
最后,(除非您的项目中有其他类必须使用v7 appCompat),您可以清理并重建项目,也可以在应用程序级别的gradle构建文件中删除此条目:
compile 'com.android.support:appcompat-v7:23.2.1'
如果您的项目中有其他类必须使用v7 appCompat,那么只需清理并重建项目。
答案 21 :(得分:6)
这是你想要片段中的AlertDialog
prepareForSegue
答案 22 :(得分:5)
您的活动正在扩展 ActionBarActivity ,需要应用 AppCompat.theme 。 从 ActionBarActivity 更改为活动或 FragmentActivity ,它将解决问题。
如果您不使用操作栏,则:
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
答案 23 :(得分:5)
我有一个主题为<android:theme="@android:style/Theme.Dialog">
的活动,该活动用于在我的 appWidget 中显示对话框,
我通过更改如下活动代码解决了该错误:
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
答案 24 :(得分:5)
根据我的经验,问题是我展示对话框的背景。 在按钮内单击我以这种方式实例化AlertDialog:
builder = new AlertDialog.Builder(getApplicationContext());
但是上下文不正确并导致错误。我已经通过这种方式使用应用程序上下文对其进行了更改:
在声明部分:
Context mContext;
onCreate方法中的
mContext = this;
最后在我需要AlertDialog的代码中:
start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (!is_running)
{
builder = new AlertDialog.Builder(mContext);
builder.setMessage("MYTEXT")
.setCancelable(false)
.setPositiveButton("SI", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Task_Started = false;
startTask();
}
})
.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
这是我的解决方案。
答案 25 :(得分:5)
您之所以这样,是因为您希望将以前的sdk版本中的主题样式中的Material Design应用到21. ActionBarActivity
需要AppTheme
所以如果您还想阻止自己对AppTheme进行自定义,只有你必须更改styles.xml(在sdk 21之前),所以这样,可以继承App Compat主题。
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
为此:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
答案 26 :(得分:5)
这个对我有用:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 27 :(得分:4)
快速解决方案。
在styles.xml中更改基本主题父
替换
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
到
<style name="AppTheme" parent="Theme.AppCompat">
答案 28 :(得分:3)
对我而言,即使我以Theme.AppCompat
作为应用程序的基本主题,上述答案也没有奏效。我正在使用com.android.support:design:24.1.0
所以我只是将版本更改为24.1.1
。在gradle sync之后,它再次工作,异常消失了。在我看来,问题在于一些旧版本的设计支持库。
如果其他答案对某些人不起作用,请将其放在此处。
答案 29 :(得分:3)
对我来说,一种解决方案,尝试从这里尝试所有解决方案后,就要改变
<activity
android:name="com.github.cythara.MainActivity"
android:label="Main">
</activity>
添加主题:
<activity
android:name="com.github.cythara.MainActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:label="Main">
</activity>
答案 30 :(得分:3)
在我的情况下,我用ApplicationContext来扩展视图。当您使用ApplicationContext时,未应用主题/样式,因此虽然我的样式中有Theme.Appcompat,但它未应用并导致此异常。更多详情:Theme/Style is not applied when inflater used with ApplicationContext
答案 31 :(得分:3)
我遇到了同样的问题。因为我正在创建自定义导航抽屉。但我忘记在我的清单中提到像这样的主题
机器人:主题= “@风格/ Theme.AppCompat.NoActionBar”
一旦我将上述主题添加到我的清单中,就解决了问题。
答案 32 :(得分:3)
这个解决方案对我有用。
设计库依赖于Support v4和AppCompat支持库,因此不要在gradle中为appcompat和设计库使用不同的版本。
使用
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
而不是
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.1.0'
答案 33 :(得分:2)
如果您在Recyclerview Adapter类中苦苦挣扎,请使用
view.getRootView().getContext()
代替
getApplicationContext() or activity.this
答案 34 :(得分:2)
对我来说,通过在我的customDialog类中将继承从AppCompatActivity更改为Activity来解决问题。 Theme.Dialog的清单中无需更改。
答案 35 :(得分:2)
这真的迫使我发表自己的答案。由于我使用的是Theme.AppCompat.Light.NoActionBar,并且还使用支持compat导入替换了所有AlertDialog,并且仍然遇到v21(Lollipop)以下的问题。 我不喜欢改变主题的想法。 所以在2天之后我终于考虑了其他为他们的AndroidManifest.xml指定AppTheme的库,是的,有一个 - &gt; “PayTM pgsdk库”。 所以跟着改变修复了问题。
使用工具:在我的项目(app)的AndroidManifest中替换方法。
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".XYZ"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_v2"
android:label="@string/app_name"
android:largeHeap="true"
android:roundIcon="@mipmap/ic_launcher_v2_round"
android:supportsRtl="true"
android:theme="@style/XYZAppTheme"
tools:replace="android:icon,android:theme">
<activity
android:name=".xyz.SplashActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
答案 36 :(得分:2)
答案 37 :(得分:2)
在Android Studio中: 将支持库添加到gradle文件并同步。 编辑build.gradle(Module:app)以获得依赖关系,如下所示:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
}
我的支持库版本是23.1.1;使用适用的支持库版本。
答案 38 :(得分:2)
如果在放大布局时使用getApplicationContext()作为参数,则可以尝试使用getBaseContext()。例如
View.inflate(getBaseContext(),
getLayoutId() == 0 ? R.layout.page_default : getLayoutId(),
null);
答案 39 :(得分:2)
我的活动与SectionsPagerAdapter和ViewPager&amp;片段
public class MyActivity extends AppCompatActivity implements ActionBar.TabListener
...
...
@Override
public void onPostResume(){
super.onPostResume();
try {
getSupportActionBar().setDisplayShowTitleEnabled(false);
}catch (NullPointerException ignored){
}
}
答案 40 :(得分:1)
首先,将其添加为import => import androidx.appcompat.app.AlertDialog
我将其发布为有史以来最小的解决方案。 我只是更改了
的实例 new AlertDialog.Builder(mContex)
到
new AlertDialog.Builder(mContext, R.style.PreferenceDialogLight)
<style name="PreferenceDialogLight" parent="Base.Theme.MaterialComponents.Dialog.Alert">
答案 41 :(得分:1)
检查您是否将正确的上下文传递给您的 Dialog
。这发生在我身上,然后我意识到我使用 AlertDialog.Builder
而不是 applicationContext
上下文来启动 Activity
。
答案 42 :(得分:1)
还原VCS本地历史记录后,别忘了清理项目
答案 43 :(得分:1)
在我的情况下,我将AppTheme
中的AndroidManifest
正确设置为从Theme.AppCompat
继承的样式。但是,各个活动在AndroidManifest
中具有样式设置,这些样式设置对此进行了覆盖。
答案 44 :(得分:1)
在我的情况下,我使用的是一种名为“ FullScreenTheme”的样式,尽管它似乎已正确定义(它是Theme.AppCompat
的后代),但却无法正常工作。
我终于意识到我正在使用一个AAR库,该库在内部也定义了一种名为“ FullScreenTheme”的样式,而它不是Theme.AppCompat
的后代。名称冲突造成了问题。
通过重命名我自己的样式名称来修复它,因此现在Android使用的是正确的样式。
答案 45 :(得分:1)
在您的app/build.gradle
中添加此依赖项:
implementation "com.google.android.material:material:1.1.0-alpha03"
更新您的styles.xml
AppTheme的父级:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"/>
答案 46 :(得分:1)
注意:我原本打算将其作为答案,但是进一步的测试表明,当从命令行使用maven构建它时仍然会失败,所以我必须编辑它才能成为问题! : - (
就我而言,当我收到此错误时,我已经在使用AppCompat主题并且错误没有多大意义。
我正在对我的android构建进行mavenizing。我已经依赖于applat的apklib和jar版本,因此:
<!-- See https://github.com/mosabua/maven-android-sdk-deployer -->
<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v7-appcompat</artifactId>
<version>${compatibility.version}</version>
<type>apklib</type>
</dependency>
<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v7-appcompat</artifactId>
<type>jar</type>
</dependency>
<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v7</artifactId>
<type>jar</type>
</dependency>
<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v4</artifactId>
</dependency>
现在,当我导入maven项目并从IntelliJ构建和运行时,它很好。
但是当我使用maven从命令行构建和部署并运行时,我仍然会遇到此异常。
答案 47 :(得分:0)
使用Kotlin,直到将Builder参数从'applicationContext'更改为'this'为止,什么都无法解决我的问题。
不起作用
val dialogDelete = AlertDialog.Builder(applicationContext)
.setTitle("Confirmation")
.setMessage("Delete this photo?")
.setNegativeButton(android.R.string.no){ it, which ->
it.dismiss()
}
dialogDelete.show()
作品
val dialogDelete = AlertDialog.Builder(this)
.setTitle("Confirmation")
.setMessage("Delete this photo?")
.setNegativeButton(android.R.string.no){ it, which ->
it.dismiss()
}
dialogDelete.show()
答案 48 :(得分:0)
如果您在项目中使用 VCS(例如,GIT),请尝试:
问题解决了!
就我而言,我删除了一个包含错误的文件,但不知何故 Studio 仍在检测该文件并因此阻止它构建。
希望对您有所帮助!
答案 49 :(得分:-1)
只是做那个
getApplicationContext()。getTheme()。applyStyle(R.style.Theme_Mc, 真);
并在您的values / styles.xml中 添加这个
<style name="Theme.Mc" parent="Theme.AppCompat.Light.NoActionBar">
<!-- ADD Your Styles -->
</style>
答案 50 :(得分:-1)
关于在应用程序中进行很多更改,而不是所有这些。.就像此视频一样简单。
https://www.youtube.com/watch?v=Bsm-BlXo2SI
我已经用过了,所以...有效率为100%。
答案 51 :(得分:-1)
对我来说,Android SDK似乎无法找到样式定义。一切都正确连线,做一个简单的项目干净修复它为我。
答案 52 :(得分:-3)
对于我的Xamarin Android项目(在MainActivity.cs中),我改变了......
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
到
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
......错误消失了。我意识到这不是每个人的解决方案,但它可能会给潜在问题提供线索。
答案 53 :(得分:-4)
如果有人仍然对这个问题感到疑惑。
试试这个:
new android.support.v7.app.AlertDialog.Builder(this)