① android 怎么刷新当前的页面
如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView加一个事件监听对象(WebViewClient)并重写其中的一些方法:shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //在当前的webview中跳转到新的url return true; } });
② android view怎样刷新
两种方式刷新:
主线程可以直接调用Invalidate()方法刷新
子线程可以直接调用postInvalidate()方法刷新。
API的描述是这样的 :Invalidatethe whole view. If the view is visible, onDraw(Canvas) will be called at somepoint in the future. This must be called from a UI thread. To call from anon-UI thread, call postInvalidate().。当Invalidate()被调用的时候,View的OnDraw()就会被调用,Invalidate()必须是在UI线程中被调用,如果在新线程中更新视图的就调用postInvalidate()。
③ Android怎么强制刷新view
关键的一句话就是:
在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。
步骤就是:
1、调用子View的invalidate()
2、跳转到上一层的invalidateChild函数中区
3、在一次调用invalidateChildInParent的函数一次层层刷新
4、具体的刷新后续操作,我就不清楚了,调用invalidate最终在代码上就在invalidateChild终止了的,所以表示有点点不清晰,求各位大牛介绍一下吧。。。。。?在此谢过了。。
让我来阅读源代码:
首先在View类中:
/**
* Invalidate the whole view. If the view is visible, {@link #onDraw} will
* be called at some point in the future. This must be called from a
* UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
*/
public void invalidate() {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
}
if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;
final ViewParent p = mParent; //获得父类View的对象
final AttachInfo ai = mAttachInfo;//获得匹配
if (p != null && ai != null) {
final Rect r = ai.mTmpInvalRect;
r.set(0, 0, mRight - mLeft, mBottom - mTop);//设置本View的尺寸,其实就是大小没有设置位置
// Don't call invalidate -- we don't want to internally scroll
// our own bounds
p.invalidateChild(this, r); //调用父类的刷新函数
}
}
}
下面我们来到Viewgroup对象:
在invalidate中,调用父View的invalidateChild,这是一个从第向上回溯的过程,每一层的父View都将自己的显示区域与传入的刷新Rect做交集。
/**
* Don't call or override this method. It is used for the implementation of
* the view hierarchy.
*/
public final void invalidateChild(View child, final Rect dirty) {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE_CHILD);
}
ViewParent parent = this;
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
final int[] location = attachInfo.mInvalidateChildLocation;
// 刷新子View的位置
location[CHILD_LEFT_INDEX] = child.mLeft;
location[CHILD_TOP_INDEX] = child.mTop;
// If the child is drawing an animation, we want to this flag onto
// ourselves and the parent to make sure the invalidate request goes
// through
final boolean drawAnimation = (child.mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION;
// Check whether the child that requests the invalidate is fully opaque
final boolean isOpaque = child.isOpaque() && !drawAnimation &&
child.getAnimation() != null;
// Mark the child as dirty, using the appropriate flag
// Make sure we do not set both flags at the same time
final int opaqueFlag = isOpaque ? DIRTY_OPAQUE : DIRTY;
do {
View view = null;
if (parent instanceof View) {
view = (View) parent;
}
if (drawAnimation) {
if (view != null) {
view.mPrivateFlags |= DRAW_ANIMATION;
} else if (parent instanceof ViewRoot) {
((ViewRoot) parent).mIsAnimating = true;
}
}
// If the parent is dirty opaque or not dirty, mark it dirty with the opaque
// flag coming from the child that initiated the invalidate
if (view != null && (view.mPrivateFlags & DIRTY_MASK) != DIRTY) {
view.mPrivateFlags = (view.mPrivateFlags & ~DIRTY_MASK) | opaqueFlag;
}
parent = parent.invalidateChildInParent(location, dirty);
} while (parent != null);
}
/**
* Don't call or override this method. It is used for the implementation of
* the view hierarchy.
*
* This implementation returns null if this ViewGroup does not have a parent,
* if this ViewGroup is already fully invalidated or if the dirty rectangle
* does not intersect with this ViewGroup's bounds.
*/
public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE_CHILD_IN_PARENT);
}
if ((mPrivateFlags & DRAWN) == DRAWN) {
if ((mGroupFlags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE)) !=
FLAG_OPTIMIZE_INVALIDATE) {
// 由父类的的位置,偏移刷新区域
dirty.offset(location[CHILD_LEFT_INDEX] - mScrollX,
location[CHILD_TOP_INDEX] - mScrollY);
final int left = mLeft;
final int top = mTop;
if (dirty.intersect(0, 0, mRight - left, mBottom - top) ||
(mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION) {
mPrivateFlags &= ~DRAWING_CACHE_VALID;
location[CHILD_LEFT_INDEX] = left;
location[CHILD_TOP_INDEX] = top;
return mParent;
}
} else {
mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;
location[CHILD_LEFT_INDEX] = mLeft;
location[CHILD_TOP_INDEX] = mTop;
dirty.set(0, 0, mRight - location[CHILD_LEFT_INDEX],
mBottom - location[CHILD_TOP_INDEX]);
return mParent;
}
}
return null;
}
另外:
Invalidate()方法不能放在线程中,所以需要把Invalidate()方法放在Handler中。在MyThread中只需要在规定时间内发送一个Message给handler,当Handler接收到消息就调用Invalidate()方法。
postInvalidate()方法就可以放在线程中做处理,就不需要Handler。
而上面的新线程MyThre可以放在OnCreate()中开始,也可以放在OnStart()中开始。
Invalidate()方法和postInvalidate()都可以在主线程中调用而刷新视图。
Invalidate()方法在SDK中是这样描述的:Invalidate the whole view. If the view is visible, onDraw(Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate(). 当Invalidate()被调用的时候,View的OnDraw()就会被调用,Invalidate()必须是在UI线程中被调用,如果在新线程中更新视图的就调用postInvalidate()。
简言之,如果确定是在main thread中调用调用话, 使用 invaludate()
否则要调用 postInvalidate()
另外,横竖屏切换使用重新构造 activity的。所以一定会重新刷新view 。
④ Android studio怎么设置刷新文件状态
可以通过定时刷新项目中的文件,首先需要打开的是Android studio的软件,并在软件中加载项目,点击菜单中的file的选项。
弹出的下拉的菜单中可以看到的是为“settings”的选项。
这样就进入到了settings的设置界面中,在设置选项的列表中有一项为version control,选项并点击进入即可。
点击完version control的选项之后,就会展开这个选项的所有菜单,可以直接点击background的选项。
直接进入到了background的设置界面中,在这个界面中,找到一项为VCS History cache settings的选项,把refresh changes every的选项勾选上,对时间进行设定根据自己需要设置时间长短。
⑤ android 怎么刷新fragment页面
通常的做法,在onResume中发一起一个异步的请求去拿数据,通过回调,收到返回的数据,然后更新UI。
网络获取数据结束判断数据有更新,然后通过set将控件的数据更新。
举例:
这个是我的一个fragment,我把它放在一个viewpager的fragment中
java">{
privatestaticfinalStringARG_CITY="city";
privateStringmCity;
privateTextViewtmpD;
privateTextViewtmpN;
privateSimpleDraweeViewimageD;
privateSimpleDraweeViewimageN;
(Stringcity){
BottomFragmentOnefragment=newBottomFragmentOne();
Bundleargs=newBundle();
args.putString(ARG_CITY,city);
fragment.setArguments(args);
returnfragment;
}
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
if(getArguments()!=null){
mCity=getArguments().getString(ARG_CITY);
}
}
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
//
Viewview=inflater.inflate(R.layout.bottom_fragment_one,container,false);
tmpD=(TextView)view.findViewById(R.id.tmp_d);
tmpN=(TextView)view.findViewById(R.id.tmp_n);
imageD=(SimpleDraweeView)view.findViewById(R.id.image_d);
imageN=(SimpleDraweeView)view.findViewById(R.id.image_n);
setUI();
returnview;
}
//用来设置UI,更新UI时重新从数据库获取数据,进行设置
publicvoidsetUI(){
Forecastforecast=mFrecastDao.getForecastByCity(mCity);
tmpD.setText(forecast.getDaily_1_max());
tmpN.setText(forecast.getDaily_1_min());
imageD.setImageURI(getImageUri(forecast.getDaily_1_code_d()));
imageN.setImageURI(getImageUri(forecast.getDaily_1_code_n()));
}
}
2.除了上面那个,还有一个类似的fragment,我想实按下按钮后,在两个fragment之间进行切换。下面是按钮代码
@Override
publicvoidonClick(Viewv){
FragmentManagerfm=getChildFragmentManager();
//开启Fragment事务
=fm.beginTransaction();
switch(v.getId())
{
caseR.id.button_left:
if(mBottomOne==null)
{
mBottomOne=newBottomFragmentOne().newInstanceOne(mCity);
}//使用当前Fragment的布局替代id_content的控件
transaction.replace(R.id.bottom_weather,mBottomOne);
break;
caseR.id.button_right:
if(mBottomTwo==null)
{
mBottomTwo=newBottomFragmentTwo().newInstanceTwo(mCity);
}
transaction.replace(R.id.bottom_weather,mBottomTwo);
break;
}
//事务提交
transaction.commit();
}
3.下面是viewpager中的fragment用来更新上面两个fragment数据的方法。
publicvoidUpdateUI(){
mBottomOne.setUI();
mBottomTwo.setUI();
}
⑥ 如何刷新Android的列表视图
从列表视图中删除数据之后,你必须调用refreshDrawableState()刷新Android的列表视图
下面是例子:
final DatabaseHelper db = new DatabaseHelper (ActivityName.this);
db.open();
db.deleteContact(arg3);
mListView.refreshDrawableState();
db.close();
和deleteContact在方法DatabaseHelper类将是长得像
public boolean deleteContact(long rowId) {
return db.delete(TABLE_NAME, BaseColumns._ID + "=" + rowId, null) > 0;
}
⑦ android列表数据刷新问题。。。
这种我建议设定一个自己的逻辑思维,采用sharedpreferences存储,那么你读取只能在这里面读取,不要去读取网路获取到的。方法有很多种,这个采用异步网络请求,我觉得最简单,一旦数据变化更新看你放到那个位置.如果是你页面没及时刷新,采用生命周期来做。so
easy!
⑧ android 怎么刷新UI组件
首先,android的UI刷新是在主线程(UI线程)中完成的。四大组件中,activity和service运行在主线程中。现在总结自己在项目中常用到的UI刷新方式。
第一,利用子线程发消息刷新UI。
子线程负责处理UI需要的数据,然后发消息到主线程来刷新UI。代码结构如下:
new Thread(new Runnable() {
@Override
public void run() {
Person person=new Person();
person.setName(mName.getText().toString().trim());
person.setPhone(mPhone.getText().toString().trim());
Log.i("person",person.toString());
DatabaseInfoFactory.getPersonDao(mContext).addPerson(person);
Looper.prepare();
Message msg=Message.obtain();
msg.what=0x123456;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
主线程中:
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==0x123456||msg.what==0x123){
fillData();
setListener();
}
}
};
第二,利用异步任务更新UI。代码结构如下:
new AsyncTask<void,void,void>() {
@Override
protected void onPostExecute(Void result) {
if(mAdapter==null){
mAdapter=new LeaveInfoAdapter();
//设置数据适配器
mLVleaveInfos.setAdapter(mAdapter);
Log.i("测试", "异步任务显示后台获得数据库数据");
}
else {
mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
//获得要显示的数据
mleaveInfos=mLeaveInfosDao.findAll();
if (mleaveInfos==null) {
Toast.makeText(HomeActivity.this,"请假数据不存在或是已经清除!", 500).show();
}
Log.i("测试", "异步任务后台获得数据库数据"+mleaveInfos.size());
return null;
}
}.execute();</void,void,void>
第三,利用配置文件+activity的生命周期方法刷新UI。
⑨ android开发怎么刷新 scrollview
代码很简单,但是很实用,适合在一个Activity中要刷新局部的UI,比如在扫描一维码的时候,要把每次扫描的结果都显示在界面上
创建一个包含ScrollView的布局文件:
2.实现ScrollView的刷新
代码如下:package com.example.uirefresh;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends Activity implements android.view.View.OnClickListener{
private Button btnExit;
private TextView text;
private ScrollView scroll;
private boolean bool = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnExit = (Button) findViewById(R.id.exit);
text = (TextView) findViewById(R.id.text);
scroll = (ScrollView) findViewById(R.id.scroll);
btnExit.setOnClickListener(this);
//在主线程main中开一子线程来刷新局部的ScrollView
new Thread(new RefreshThread()).start();
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.exit :
finish();
break;
}
}
public class RefreshThread implements Runnable{
@Override
public void run() {
while(bool) {
try {
Thread.sleep(5000);//每五秒刷新一次
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
//用post方法刷新
text.post(new Runnable() {
@Override
public void run() {
text.append("Hello World...n");
}
});
}
}
}
}
@Override
protected void onDestroy(){
super.onDestroy();
bool = false;
}
}
⑩ android怎么刷新activity
刷新activity的方法:
1. 刷新当前activity界面数据(手动刷新):
在activity类下新增一个refresh()方法:
/**
* 刷新, 这种刷新方法,只有一个Activity实例。
*/
public void refresh() {
onCreate(null);
}
2. 刷新另一个activity界面数据(自动刷新):
在涉及到sqlite3数据库操作的activity类下重写onResume()方法:(此处建议复习下activity的生命周期, 并了解下onResume()方法的使用)
/**
* 调用onCreate(), 目的是刷新数据,
* 从另一activity界面返回到该activity界面时, 此方法自动调用
*/
@Override