마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

java.lang.ClassCastException 관련 질문 드려요

0 추천

안녕하세요

지금 언리얼 엔진을 통한 Webview를 띄우는 과정에서 에러가 나서 

그 원인을 잘모르겠기에 이렇게 질문 올립니다.(엔진 제공 코드 인데 이렇게 에러가 나네요...)

 

일단 아래는 해당 Javacode 고요 

여기서 GameActivity 클래스는 extends 로 NativeAcitivy 를 쓰고있습니다.

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.

package com.epicgames.ue4;

import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.view.View;
import android.view.MotionEvent;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.LinearLayout;
import android.widget.PopupWindow;

import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TableRow;

class WebViewControl
{
   public WebViewControl()
   {
      GameActivity._activity.runOnUiThread(new Runnable()
      {
         @Override
         public void run()
         {
            Log.d("Webview Control", "On WebViewControl");
            webView = new WebView(GameActivity._activity);
            webView.setWebViewClient(new WebViewClient());
            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl("about:blank");
         }
      });
   }

   public void LoadURL(final String url)
   {
      GameActivity._activity.runOnUiThread(new Runnable()
      {
         @Override
         public void run()
         {
            Log.d("Webview Control", "On LoadURL");
            webView.loadUrl(url);
         }
      });
   }

   public void Update(final int x, final int y, final int width, final int height)
   {
      GameActivity._activity.runOnUiThread(new Runnable()
      {
         @Override
         public void run()
         {
            Log.d("Webview Control", "On Update");
            if (webPopup == null)
            {
               webPopup = new PopupWindow(GameActivity._activity);
               webPopup.setWidth(width);
               webPopup.setHeight(height);
               webPopup.setClippingEnabled(false);
               webPopup.setBackgroundDrawable((Drawable) null); // no border
               webPopup.setFocusable(true); // required for keyboard

               webLayout = new LinearLayout(GameActivity._activity);
               webLayout.setOrientation(LinearLayout.VERTICAL);
               webLayout.setPadding(0, 0, 0, 0);

               MarginLayoutParams params = new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
               params.setMargins(0, 0, 0, 0);
               webLayout.addView(webView, params);

               webPopup.setContentView(webLayout);
               webPopup.showAtLocation(GameActivity._activity.activityLayout, Gravity.NO_GRAVITY, x, y);
               webPopup.update();

               // allow touch outside the popup. setOutsideTouchable(false) does nothing when the popup is focusable.

               WindowManager.LayoutParams p = (WindowManager.LayoutParams) webLayout.getLayoutParams();
               p.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
               WindowManager windowManager = GameActivity._activity.getWindowManager();
               windowManager.updateViewLayout(webLayout, p);
            }
            else
            {
               webPopup.update(x, y, width, height);
            }
         }
      });
   }

   public void Close()
   {
      GameActivity._activity.runOnUiThread(new Runnable()
      {
         @Override
         public void run()
         {
            Log.d("Webview Control", "On Close");
            if (webPopup != null)
            {
               webPopup.dismiss();
               webPopup = null;
            }
         }
      });
   }
   
   // Web Views
   private PopupWindow webPopup;
   private LinearLayout webLayout;
   private WebView webView;
}

 

그리고 아래는 에러 로그

12-30 18:33:46.417: D/Webview Control(15363): On Update
12-30 18:33:46.426: D/AndroidRuntime(15363): Shutting down VM
12-30 18:33:46.437: E/AndroidRuntime(15363): FATAL EXCEPTION: main
12-30 18:33:46.437: E/AndroidRuntime(15363): Process: com.YourCompany.AndroidWebTest, PID: 15363
12-30 18:33:46.437: E/AndroidRuntime(15363): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.view.WindowManager$LayoutParams
12-30 18:33:46.437: E/AndroidRuntime(15363):     at com.epicgames.ue4.WebViewControl$3.run(WebViewControl.java:85)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at android.os.Handler.handleCallback(Handler.java:739)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at android.os.Looper.loop(Looper.java:148)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at android.app.ActivityThread.main(ActivityThread.java:5417)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at java.lang.reflect.Method.invoke(Native Method)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-30 18:33:46.437: E/AndroidRuntime(15363):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-30 18:33:46.439: W/ActivityManager(783):   Force finishing activity com.YourCompany.AndroidWebTest/com.epicgames.ue4.GameActivity

 

 

 

여기저기 뒤져봐도 이와 관련된 에러 부분은 없더라고요. 

WindowManager.LayoutParams p = (WindowManager.LayoutParams) webLayout.getLayoutParams();

 

이 부분에서 에러가 나는건 알겠는대 그나마 비슷한 사례로 찾아보니 

http://stackoverflow.com/questions/14004063/classcastexception-linearlayout-layoutparams

위 의 답변에서 부모로 FrameLayout이 상속되어있어서 그런다고 하는거 같은데 해당 GameActivity 클래스에는 FrameLayout 관련된 코드는 보이지 않고요

 

이와 관련된 사항 아시는분 있으면 답변 부탁드려요~

 

 

 

하루일과 (330 포인트) 님이 2015년 12월 30일 질문

1개의 답변

0 추천
GameActivity 클래스를 살펴보지 마시고

GameActivity의 레이아웃을 살펴보세여..
poporo (3,960 포인트) 님이 2015년 12월 31일 답변
찾아보니 해당 layout이 없어 GameAcitivty oncreate 코드에
    MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 0, 0, 0);
        activityLayout = new LinearLayout(_activity);
        _activity.setContentView(activityLayout, params);

이런식으로 Layout을 세팅하더라고요

아! 답변 감사드려요~
액티비티의 최상위는 아마 기본이 FrameLayout일텐데 이걸 가져오나본데여..
어짜피 해당 GameActivity의 LayoutParams를 가져오는거라면 WebViewControlg을 호출할떄부터 값을 같이 던져주고 리턴받는건 어떨까요
죄송한데 말씀이 정확히 이해가 안되네요; WebViewControl이 호출될때 값을 같이 던져 주라는건 GameActvity 에서 LayoutParam값을 WebviewControl을 호출할때 넘겨주라는 건가요?
GameActvity 에서 LayoutParam값이 먼저 WindowManager.LayoutParams 의 값인지 체크한뒤 WebViewControl 호출할때 인자값으로 넘기는식으로..
...