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"自己的主题风格,问题解决