Android - 无法动态更改 RelativeLayout width/height
Android - can't change RelativeLayout width/height dynamically
我正在使用 MediaPlayer xml
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView">
</WebView>
<RelativeLayout
android:id="@+id/relativeL"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true">
<SurfaceView
android:id="@+id/surfView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
我想做的是在按下某个键时更改 relativeL(以及其中的播放器)的 width/height
我在按键上调用这个函数,但它没有任何影响,没有错误,只是没有发生任何事情。在我在 xml 中添加 webview 之前,此功能运行良好。如您所见,webview 在播放器的后台。这是函数:
public static boolean makePlayerSmall(){
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(650, 400);
params1.setMargins(100, 120, 0, 0);
MainActivity.RL.setLayoutParams(params1);
MainActivity.RL.invalidate();
return true;
}
还有我在 MainActivity 中的 onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setImmersiveFullScreen();
setContentView(R.layout.activity_main);
RL = (RelativeLayout)findViewById(R.id.relativeL);
webView = (WebView)findViewById(R.id.webView);
assert webView != null;
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(false);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
webView.addJavascriptInterface(new MyJSInterface(this), "MyJSInterface");
webView.loadUrl("http://85.118.98.251/misho_android/c/?debug&debug_key=4581f079f3629a2a78909251fb402a99&mac=00%3A1A%3A79%3A04%3A97%3A3E");
//setup ui elements
vidSurface = (SurfaceView) findViewById(R.id.surfView);
vidHolder = vidSurface.getHolder();
vidHolder.addCallback(this);
}
非常感谢任何帮助,谢谢!
public static void replace(View target, ViewGroup.LayoutParams params) {
if (target == null) {
return;
}
final ViewParent viewParent = target.getParent();
if (viewParent != null && viewParent instanceof ViewGroup) {
final ViewGroup parent = (ViewGroup) viewParent;
final int index = parent.indexOfChild(target);
parent.removeViewInLayout(target);
parent.addView(target, index, params);
} else {
throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
}
}
试试这个替代品
我尝试了很多东西,最后它通过 运行 主线程中的代码工作(但我认为它首先是 运行 在主线程中)。我现在要对这个话题做一些研究。
(new Handler(Looper.getMainLooper())).post(new Runnable() {
@Override
public void run() {
Player.makePlayerSmall();
}
});
我正在使用 MediaPlayer xml
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView">
</WebView>
<RelativeLayout
android:id="@+id/relativeL"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true">
<SurfaceView
android:id="@+id/surfView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
我想做的是在按下某个键时更改 relativeL(以及其中的播放器)的 width/height
我在按键上调用这个函数,但它没有任何影响,没有错误,只是没有发生任何事情。在我在 xml 中添加 webview 之前,此功能运行良好。如您所见,webview 在播放器的后台。这是函数:
public static boolean makePlayerSmall(){
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(650, 400);
params1.setMargins(100, 120, 0, 0);
MainActivity.RL.setLayoutParams(params1);
MainActivity.RL.invalidate();
return true;
}
还有我在 MainActivity 中的 onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setImmersiveFullScreen();
setContentView(R.layout.activity_main);
RL = (RelativeLayout)findViewById(R.id.relativeL);
webView = (WebView)findViewById(R.id.webView);
assert webView != null;
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(false);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
webView.addJavascriptInterface(new MyJSInterface(this), "MyJSInterface");
webView.loadUrl("http://85.118.98.251/misho_android/c/?debug&debug_key=4581f079f3629a2a78909251fb402a99&mac=00%3A1A%3A79%3A04%3A97%3A3E");
//setup ui elements
vidSurface = (SurfaceView) findViewById(R.id.surfView);
vidHolder = vidSurface.getHolder();
vidHolder.addCallback(this);
}
非常感谢任何帮助,谢谢!
public static void replace(View target, ViewGroup.LayoutParams params) {
if (target == null) {
return;
}
final ViewParent viewParent = target.getParent();
if (viewParent != null && viewParent instanceof ViewGroup) {
final ViewGroup parent = (ViewGroup) viewParent;
final int index = parent.indexOfChild(target);
parent.removeViewInLayout(target);
parent.addView(target, index, params);
} else {
throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
}
}
试试这个替代品
我尝试了很多东西,最后它通过 运行 主线程中的代码工作(但我认为它首先是 运行 在主线程中)。我现在要对这个话题做一些研究。
(new Handler(Looper.getMainLooper())).post(new Runnable() {
@Override
public void run() {
Player.makePlayerSmall();
}
});