love li fang fang forever

在activity中更新UI的方法。

• _posts

迁移源地址为:《在activity中更新UI的方法。》

该日志做为草稿日志,写在这儿便于下次使用参考,后续更新至知乎。 方法一。广播。 问题一:如何在外部广播中更新activity的内容呢?。 大家先看一下外部的广播。 if (intent.getAction().equals(“DELIVERY_MESS_ACTION”)) { if (getResultCode() == -1) { Toast.makeText(context, “发送成功”, 1).show(); } else if (getResultCode() == 0) { Toast.makeText(context, “发送失败”, 1).show(); } } 如果是想要在activity中,不用Toast怎么办呢。 下面看看方法。 Tips :android中的消息传递机制,也就是Handler,不错,这个可行。还有那就是runOnUiThread 这个方法。

questions:如果直接使用,MainActivity.this.runOnUiThread 会导致”“No enclosing instance of the type MainActivity is accessible in scope” “ 个问题,这是因为MainActivity 并不是内部类,怎么解决呢?我们现在想要在广播中得到activity的上下文,这是这个问题的关键!,由于activity不是我们new出来的,所以可以这么做 在activity中创建一个静态类成员变量 instance 在onCreate方法的最后,将this赋值给instance 自己写一个静态方法getInstance 在广播中得到activity的上下文即可 这样以后,我们可以参考以下代码实现。

if (intent.getAction().equals(“DELIVERY_MESS_ACTION”)) { if (getResultCode() == -1) { // Toast.makeText(context, “发送成功”, 1).show(); MessSendActivity.getInstance().runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    // Toast.makeText(MessSendActivity.getInstance(),
                    // "from messSend", 1).show();
                    ProgressBar pb = (ProgressBar) MessSendActivity
                            .getInstance().findViewById(R.id.pb);
                    pb.setVisibility(View.INVISIBLE);
                }
            });
        } else if (getResultCode() == 0) {
            Toast.makeText(context, "发送失败", 1).show();
        }
    }

问题二:如何用内部类的广播呢。 参考:

public class MainActivity extends Activity {

private MyReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    receiver = new MyReceiver(new Handler()); // Create the receiver
    registerReceiver(receiver, new IntentFilter("some.action")); // Register receiver

    sendBroadcast(new Intent("some.action")); // Send an example Intent
}

public static class MyReceiver extends BroadcastReceiver {

    private final Handler handler; // Handler used to execute code on the UI thread

    public MyReceiver(Handler handler) {
        this.handler = handler;
    }

    @Override
    public void onReceive(final Context context, Intent intent) {
        // Post the UI updating code to our Handler
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
            }
        });
    }
} } 问题三,内部广播静态注册注意事项?

Mainfest.xml参考。

注意事项:内部类的广播一定是static的,不然会找不到。内部类使用$符号而不是.,使用会出现类找不到异常。 public static class DataAcceptBroadcastReceiver extends BroadcastReceiver { private final Handler handler;

public DataAcceptBroadcastReceiver() {
    handler = mHandler;
}

public DataAcceptBroadcastReceiver(Handler handler) {
    this.handler = handler;
}

@Override
public void onReceive(Context context, final Intent intent) {
    System.out.println("--qydq--MainActivity收到DataSendClientHandler消息--内容--" + intent.getStringExtra("ret"));
    isRunnint = true;
    acceptAccount++;
    Message msg = new Message();
    msg.obj = intent.getStringExtra("ret");
    msg.what = SERVERDATA;
    handler.sendMessage(msg);
} 用handler去更新UI,可以TextView等可以是静态的。也可以是private TextView tvTime类型的。如果是上面引用的区别为: @@@@@new DataAcceptBroadcastReceiver (mHandler);这种是在外部的,mHandler是Activity的成员静态变量。 //mHandler用于更新UI。 public static final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch (msg.what) private static TextView tvTime; private static TextView tvContent; private static TextView tvBtnMes; private static TextView tvContentTips;

@@@@@new DataAcceptBroadcastReceiver (new Handler);而这种方式直接在onReceiver方法中使用 handler.post(new Runnable() { @Override public void run() { Toast.makeText(context, “Toast from broadcast receiver”, Toast.LENGTH_SHORT).show(); } }); 在使用的时候,程序内注册,register是放在onCreate中,unregister是放在onDestroy中。

方法二:可以参考,直接静态的控件,生命为public,然后,(MainActivity)context.textview.setText(); GitHub.com/qydq/an-aw/ GitHub.com/qydq/aw-an/ 项目

public class SlideBackActivity extends Activity{

 //手指上下滑动时的最小速度
 private static final int YSPEED_MIN = 1000;

 //手指向右滑动时的最小距离
 private static final int XDISTANCE_MIN = 50;

 //手指向上滑或下滑时的最小距离
 private static final int YDISTANCE_MIN = 100;

 //记录手指按下时的横坐标。
 private float xDown;

 //记录手指按下时的纵坐标。
 private float yDown;

 //记录手指移动时的横坐标。
 private float xMove;

 //记录手指移动时的纵坐标。
 private float yMove;

 //用于计算手指滑动的速度。
 private VelocityTracker mVelocityTracker;

 @Override
 public boolean dispatchTouchEvent(MotionEvent event) {
      createVelocityTracker(event);
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
            xDown = event.getRawX();
            yDown = event.getRawY();
            break;
      case MotionEvent.ACTION_MOVE:
            xMove = event.getRawX();
            yMove= event.getRawY();
            //滑动的距离
            int distanceX = (int) (xMove - xDown);
            int distanceY= (int) (yMove - yDown);
            //获取顺时速度
            int ySpeed = getScrollVelocity();
            //关闭Activity需满足以下条件:
            //1.x轴滑动的距离>XDISTANCE_MIN
            //2.y轴滑动的距离在YDISTANCE_MIN范围内
            //3.y轴上(即上下滑动的速度)<XSPEED_MIN,如果大于,则认为用户意图是在上下滑动而非左滑结束Activity
            if(distanceX > XDISTANCE_MIN &&(distanceY<YDISTANCE_MIN&&distanceY>-YDISTANCE_MIN)&& ySpeed < YSPEED_MIN) {
                  finish();
            }
            break;
      case MotionEvent.ACTION_UP:
            recycleVelocityTracker();
            break;
      default:
            break;
      }
      return super.dispatchTouchEvent(event);
}

/**
  * 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker当中。
  *
  * @param event
  *
  */
private void createVelocityTracker(MotionEvent event) {
     if (mVelocityTracker == null) {
            mVelocityTracker = VelocityTracker.obtain();
     }
     mVelocityTracker.addMovement(event);
}

/**
  * 回收VelocityTracker对象。
  */
private void recycleVelocityTracker() {
      mVelocityTracker.recycle();
      mVelocityTracker = null;
}

/**
  *
  * @return 滑动速度,以每秒钟移动了多少像素值为单位。
  */
private int getScrollVelocity() {
      mVelocityTracker.computeCurrentVelocity(1000);
      int velocity = (int) mVelocityTracker.getYVelocity();
      return Math.abs(velocity);
}

}

public class SlideBackActivity extends Activity{

 //手指上下滑动时的最小速度
 private static final int YSPEED_MIN = 1000;

 //手指向右滑动时的最小距离
 private static final int XDISTANCE_MIN = 50;

 //手指向上滑或下滑时的最小距离
 private static final int YDISTANCE_MIN = 100;

 //记录手指按下时的横坐标。
 private float xDown;

 //记录手指按下时的纵坐标。
 private float yDown;

 //记录手指移动时的横坐标。
 private float xMove;

 //记录手指移动时的纵坐标。
 private float yMove;

 //用于计算手指滑动的速度。
 private VelocityTracker mVelocityTracker;

 @Override
 public boolean dispatchTouchEvent(MotionEvent event) {
      createVelocityTracker(event);
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
            xDown = event.getRawX();
            yDown = event.getRawY();
            break;
      case MotionEvent.ACTION_MOVE:
            xMove = event.getRawX();
            yMove= event.getRawY();
            //滑动的距离
            int distanceX = (int) (xMove - xDown);
            int distanceY= (int) (yMove - yDown);
            //获取顺时速度
            int ySpeed = getScrollVelocity();
            //关闭Activity需满足以下条件:
            //1.x轴滑动的距离>XDISTANCE_MIN
            //2.y轴滑动的距离在YDISTANCE_MIN范围内
            //3.y轴上(即上下滑动的速度)<XSPEED_MIN,如果大于,则认为用户意图是在上下滑动而非左滑结束Activity
            if(distanceX > XDISTANCE_MIN &&(distanceY<YDISTANCE_MIN&&distanceY>-YDISTANCE_MIN)&& ySpeed < YSPEED_MIN) {
                  finish();
            }
            break;
      case MotionEvent.ACTION_UP:
            recycleVelocityTracker();
            break;
      default:
            break;
      }
      return super.dispatchTouchEvent(event);
}

/**
  * 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker当中。
  *
  * @param event
  *
  */
private void createVelocityTracker(MotionEvent event) {
     if (mVelocityTracker == null) {
            mVelocityTracker = VelocityTracker.obtain();
     }
     mVelocityTracker.addMovement(event);
}
/**
  * 回收VelocityTracker对象。
  */
private void recycleVelocityTracker() {
      mVelocityTracker.recycle();
      mVelocityTracker = null;
}
/**
  *
  * @return 滑动速度,以每秒钟移动了多少像素值为单位。
  */
private int getScrollVelocity() {
      mVelocityTracker.computeCurrentVelocity(1000);
      int velocity = (int) mVelocityTracker.getYVelocity();
      return Math.abs(velocity);
}

} 阅读(31)| 评论(1)