英文:
androidx.mediarouter.app.MediaRouteButton throwing android.view.InflateException because of translucent background
问题
以下是您要求的翻译内容:
我在过去的几天里一直在开发一个 Flutter 插件。我试图将一个现有的媒体播放器实现到一个 Flutter 小部件中。然而,由于媒体播放器的 SDK 在播放器视图中使用了 MediaRouteButtons,所以当我尝试膨胀它时,我遇到了 android.view.InflateException
错误。
核心原因是因为背景不能是半透明的。我尝试过通过自定义主题或使用带有不透明背景的内置主题来设置主活动的 colorPrimary
。但这没有效果,错误仍然存在。
我怀疑 Flutter 在某个地方添加了自己的主题,这导致了问题,但我找不到任何有用的信息。
SDK 本身不是问题,因为我正在使用只有一个 MediaRouteButton
的空视图进行相同功能的测试。以下是我的布局:
<androidx.mediarouter.app.MediaRouteButton
android:id="@+id/media_route_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
我正在创建一个 PlatformView
,在构造函数中我试图膨胀视图。以下是构造函数,而引发异常的是 LayoutInflater
。
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
以下是我尝试使用的自定义主题:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorPrimary">#FFFFFFFF</item>
</style>
</resources>
我在插件清单、应用程序清单中设置过它,甚至在生成的 MainActivity.java
活动中使用了 setTheme()
。
似乎没有任何帮助,所以任何线索都将是极好的。如果有人了解 Flutter 如何为插件 Activity
设置主题,那么对此的解释将会非常赞赏。
英文:
I have been working on a flutter plugin for the last few days. I am trying to implement and existing media player into a flutter widget. However since the media player's SDK uses MediaRouteButtons in the player view I have been getting an android.view.InflateException
when trying to inflate it.
The core reason is because the background cannot be translucent. I have tried to set the main activity's colorPrimary
through custom themes or using built in themes with opaque backgrounds. This has no effect and the error is persistant.
I suspect that flutter is adding its own theme somewhere in the mix and this is causing the issue, but I couldn't find any helpful information on that.
The SDK itself is not the problem since I am testing the same functionality with an empty view with only a MediaRouteButton
.
Here is my layout:
<androidx.mediarouter.app.MediaRouteButton
android:id="@+id/media_route_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
I am creating a PlatformView
and in the constructor I am trying to inflate the view. This is the constructor and the LayoutInflater
is the one throwing the exception.
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
This is a custom theme I have tried using
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorPrimary">#FFFFFFFF</item>
</style>
</resources>
I set it in the plugin manifest and also in the app manifest, and even in the generated MainActivity.java
activity by using setTheme()
.
Nothing seems to help, so any leads would be great. If someone understands how flutter sets the themes for the plugin Activity
an explanation would be greatly appreciated.
答案1
得分: 0
我通过从传递到我的 PlatforView
构造函数中的 context
设置活动的主题来解决了这个问题。
Before
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
After
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
// android:colorPrimary 在 AppTheme 中是不透明的
context.setTheme(R.style.AppTheme);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
此外,还可以通过在 Flutter 插件中实现 ActivityAware
接口,并覆盖 onAttachedToActivity
和 onReattachedToActivity
方法来实现。
例如:
public class YourFlutterPlugin implements FlutterPlugin, ActivityAware{
//...
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
Context context = binding.getActivity();
// 将上下文发送到视图的代码
// 示例: platformView.setContext(context);
}
@Override
public void onReattachedToActivity(@NonNull ActivityPluginBinding binding) {
Context context = binding.getActivity();
// 将上下文发送到视图的代码
// 示例: platformView.setContext(context);
}
// ...
}
英文:
I managed to resolve the issue by setting the theme of the activity from the context
passed into my PlatforView
constructor
Before
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
After
FlutterPlayerView(Context context, BinaryMessenger messenger, int id) {
this.channel = new MethodChannel(messenger, CHANNEL + id);
this.channel.setMethodCallHandler(this);
// android:colorPrimary is opaque in AppTheme
context.setTheme(R.style.AppTheme);
View view = LayoutInflater.from(context).inflate(R.layout.button_view, null);
this.buttonView = view.findViewById(R.id.media_route_button);
}
Also there is a way to do it by implementing the ActivityAware
interface in your Flutter plugin and overriding the onAttachedToActivity
and onRettachedToActivity
methods.
For example:
public class YourFlutterPlugin implements FlutterPlugin, ActivityAware{
//...
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
Context context = binding.getActivity();
// Your code for sending the context to the view
// Example: platformView.setContext(context);
}
@Override
public void onReattachedToActivity(@NonNull ActivityPluginBinding binding) {
Context context = binding.getActivity();
// Your code for sending the context to the view
// Example: platformView.setContext(context);
}
// ...
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论