androidx.mediarouter.app.MediaRouteButton 由于半透明背景抛出 android.view.InflateException
androidx.mediarouter.app.MediaRouteButton throwing android.view.InflateException because of translucent background
最近几天我一直在研究一个 flutter 插件。我正在尝试将现有的媒体播放器实现为一个 flutter 小部件。但是,由于媒体播放器的 SDK 在播放器视图中使用了 MediaRouteButtons,因此我在尝试为其充气时收到 android.view.InflateException
。
核心原因是背景不能半透明。我试图通过自定义主题或使用不透明背景的内置主题来设置主 activity 的 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
activity 中使用 setTheme()
.
似乎没有任何帮助,所以任何线索都很好。如果有人了解 flutter 如何设置插件的主题 Activity
,将不胜感激。
我设法通过设置 context
中 activity 的主题来解决问题,并传递到我的 PlatforView
构造函数
之前
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);
}
之后
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);
}
还有一种方法可以通过在 Flutter 插件中实现 ActivityAware
接口并覆盖 onAttachedToActivity
和 onRettachedToActivity
方法来实现。
例如:
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);
}
// ...
}
最近几天我一直在研究一个 flutter 插件。我正在尝试将现有的媒体播放器实现为一个 flutter 小部件。但是,由于媒体播放器的 SDK 在播放器视图中使用了 MediaRouteButtons,因此我在尝试为其充气时收到 android.view.InflateException
。
核心原因是背景不能半透明。我试图通过自定义主题或使用不透明背景的内置主题来设置主 activity 的 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
activity 中使用 setTheme()
.
似乎没有任何帮助,所以任何线索都很好。如果有人了解 flutter 如何设置插件的主题 Activity
,将不胜感激。
我设法通过设置 context
中 activity 的主题来解决问题,并传递到我的 PlatforView
构造函数
之前
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);
}
之后
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);
}
还有一种方法可以通过在 Flutter 插件中实现 ActivityAware
接口并覆盖 onAttachedToActivity
和 onRettachedToActivity
方法来实现。
例如:
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);
}
// ...
}