Android开发之WebView输入框提示解决办法
做基于WebView应用时,页面上有一个输入框,当输入的文字过多时,超过输入框的行数时,输入框能够滚动,这时间问题来了,输入的提示箭头会移动到输入框外,如何解决这个问题呢,查找chromium源码如下:
voidLoadIfNecessary(jobjectcontext){ if(loaded_) return; loaded_=true; TRACE_EVENT0("browser","HandleResources::Create"); JNIEnv*env=base::Android::AttachCurrentThread(); if(!context) context=base::android::GetApplicationContext(); left_bitmap_=CreateSkBitmapFromJavaBitmap( Java_HandleViewResources_getLeftHandleBitmap(env,context)); right_bitmap_=CreateSkBitmapFromJavaBitmap( Java_HandleViewResources_getRightHandleBitmap(env,context)); center_bitmap_=CreateSkBitmapFromJavaBitmap( Java_HandleViewResources_getCenterHandleBitmap(env,context)); left_bitmap_.setImmutable(); right_bitmap_.setImmutable(); center_bitmap_.setImmutable(); drawable_horizontal_padding_ratio_= Java_HandleViewResources_getHandleHorizontalPaddingRatio(env); }
这个函数加载这几个图片,在java端,
privatestaticBitmapgetHandleBitmap(Contextcontext,finalint[]attrs){ //TODO(jdduke):Properlyderiveandapplythemecolor. TypedArraya=context.getTheme().obtainStyledAttributes(attrs); finalintresId=a.getResourceId(a.getIndex(0),0); finalResourcesres=a.getResources(); a.recycle(); finalBitmap.Configconfig=Bitmap.Config.ARGB_8888; finalBitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=false; options.inPreferredConfig=config; Bitmapbitmap=BitmapFactory.decodeResource(res,resId,options); savePic(bitmap); if(bitmap!=null)returnbitmap; //Ifthemedresourcelookupfails,fallbacktousingtheContext's //resourcesforattributelookup. if(res!=context.getResources()){ bitmap=BitmapFactory.decodeResource(context.getResources(),resId,options); if(bitmap!=null)returnbitmap; } Drawabledrawable=getHandleDrawable(context,attrs); assertdrawable!=null; finalintwidth=drawable.getIntrinsicWidth(); finalintheight=drawable.getIntrinsicHeight(); BitmapcanvasBitmap=Bitmap.createBitmap(width,height,config); Canvascanvas=newCanvas(canvasBitmap); drawable.setBounds(0,0,width,height); drawable.draw(canvas); returncanvasBitmap; }
C++中会调用java中的函数getHandleBitmap,这个函数通过context.getTheme().obtainStyledAttributes这个函数,从jdk中加载图片资源,显示时,通过GetBitmap函数获取到图像信息,通过layer_->SetBitmap(bitmap)设置显示的内容,函数如下:
constSkBitmap&GetBitmap(ui::TouchHandleOrientationorientation){ DCHECK(loaded_); switch(orientation){ caseui::TouchHandleOrientation::LEFT: returnleft_bitmap_; caseui::TouchHandleOrientation::RIGHT: returnright_bitmap_; caseui::TouchHandleOrientation::CENTER: returncenter_bitmap_; caseui::TouchHandleOrientation::UNDEFINED: NOTREACHED()<<"Invalidtouchhandleorientation."; }; returncenter_bitmap_; }
这么分析下来,想从显示下手解决这个问题,似乎不太可能,那只有替换图片资源,而图像资源是在android.jar包中,还有其他办法吗?分析源码,
publicstaticDrawablegetLeftHandleDrawable(Contextcontext){ returngetHandleDrawable(context,LEFT_HANDLE_ATTRS); } publicstaticDrawablegetCenterHandleDrawable(Contextcontext){ returngetHandleDrawable(context,CENTER_HANDLE_ATTRS); } publicstaticDrawablegetRightHandleDrawable(Contextcontext){ returngetHandleDrawable(context,RIGHT_HANDLE_ATTRS); }
有这几个图像id信息,是不是可以重载呢,于是添加自己的
<?xmlversion="1.0"encoding="utf-8"?> <resources> <stylename="MyTheme"> <itemname="android:textSelectHandleLeft">@drawable/ic_launcher</item> <itemname="android:textSelectHandle">@drawable/aa</item> <itemname="android:textSelectHandleRight">@drawable/ic_launcher</item> </style> </resources>
替换掉系统的资源,再添加android:theme="@style/MyTheme"自己的主题风格,问题解决