首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

两个不同的类,如何传递handler参数?顺便讨教下点有关问题。

2013-08-01 
两个不同的类,怎么传递handler参数?顺便讨教下点问题。。有点点长。。。我现在要在非activity的类里面,传递参数

两个不同的类,怎么传递handler参数?顺便讨教下点问题。。
有点点长。。。
我现在要在非activity的类里面,传递参数给activity那里,但是发觉传不了,这是我的测试代码,
求过路人给点思路。。。
非activity普通类:



public class HandlerTest {
private Handler handler = null;
private MainActivity mainActivity = null;
public HandlerTest(){
  
}
public void init(){//初始化
  mainActivity = MainActivity.getMainActivity();
  handler = mainActivity.getHandler();
}
public void sendMsg(){//发送信息
  Message msg = new Message();
  msg.what = MainActivity.TEST;
  handler.sendMessage(msg);  
}
}


activity类:


public class MainActivity extends Activity {
public static final int TEST = 0;  
private TextView tv = null;
private HandlerTest ht = null;
private Button b = null;
  private  static MainActivity mainActivity = new MainActivity();

public static MainActivity getMainActivity() {//其实目的是返回本身这个类,想获得里面的控件
  return mainActivity;
}
private Handler handler = new Handler(){
  public void handleMessage(Message msg){
   switch(msg.what){
    case TEST:{
                        Toast.makeText(MainActivity.this, "test handler", Toast.LENGTH_SHORT).show();
                        tv.setText("hello");
    }break;
    default:break;
   }
  }
};
public Handler getHandler() {
  return handler;
}
public void setHandler(Handler handler) {
  this.handler = handler;

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  tv = (TextView)this.findViewById(R.id.TextViewTestID);
  b  = (Button)this.findViewById(R.id.ButtonTestID);
  ht = new HandlerTest();
  
  b.setOnClickListener(new OnClickListener() {      


   public void onClick(View arg0) {
    ht.init();
    ht.sendMsg();        //发送信息
   }
  });

}





要是我点一下Button按钮,程序立马就崩溃了,看来这样的传递参数是不行的,或者自己操作方式不对。。
所以想问下大家,到底怎样才能把参数从非activity传递到activity才是对的?

另外想讨论下,
其实我是想把activity里面的控件的那些监听的那些动作放在非activity那里实现的,
然后activity和非activity之间的控件是指向同一个地址的,所以我才会有
private static MainActivity mainActivity = new MainActivity();
这个,目的是想实现让各个类操控的控件相一致的,。。。

会这样把它们分开来,是因为在同一个activity里面的控件是在太多了,
感觉有点多东西,所以才把它们拆开来,弄成两个一个是main的activity,一个是实现
main的里面的控件实现函数。
另外想问一下,当一个mainActivity里面的控件过多的时候,你们是怎么排版,或者怎么处理的?
是不是都是放在同一个activity里面,然后排版,排好的那种,还是像我这样,还是说怎么样的?
我初学,好奇,希望分享下。。。

有点点长。。。
但是我好想找个人能讨论下,希望回帖,谢谢回帖。。 
类 控件 Java Android
[解决办法]
activity中直接new一个你需要的类的对象,类对象集成各种监听接口应该就行了。。

比如最简单的
package com.lxl;

import android.content.Context;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;

public class MyImageView extends Button implements OnClickListener,
OnLongClickListener, OnTouchListener {
private int doornum = 0;
private RelativeLayout layout;
private LayoutParams lp;
private TextView advicetext;
private boolean flag = false;// 当flag为false的时候表示关门,为true的时候表示开门

public MyImageView(Context ParentContext, int doornum,
RelativeLayout layout, TextView advicetext) {
// TODO Auto-generated constructor stub
super(ParentContext);


this.setOnClickListener(this);
this.setOnLongClickListener(this);
this.setOnTouchListener(this);
this.doornum = doornum;
this.lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
this.lp.setMargins(0, 10, 0, 10);
this.layout = layout;
this.advicetext = advicetext;
closeDoor();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub

return false;
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("你点击的按钮为" + doornum + "号按钮");
if (this.flag) {
closeDoor();
} else {
openDoor();
}
this.flag = !this.flag;
this.advicetext.setText(doornum + "号门处于" + (flag ? "开启" : "关闭") + "状态");
}

public LayoutParams getLayoutParams() {
return this.lp;
}

public void closeDoor() {
this.setBackgroundColor(Color.RED);
}

public void openDoor() {
this.setBackgroundColor(Color.GREEN);
}

public void setLeft() {
this.lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
}

public void setRight() {
this.lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}

public void addView() {
this.layout.addView(this, lp);
}
}


[解决办法]
这代码写的............两个不同的类,如何传递handler参数?顺便讨教下点有关问题。
帮你改了下...



import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class SecActivity extends Activity {
    public static final int TEST = 0;

    public TextView tv = null;
    private HandlerTest ht = null;
    private Button b = null;



    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case TEST:
                    Toast.makeText(SecActivity.this, "test handler", Toast.LENGTH_SHORT).show();
                    tv.setText("hello");
                    break;
                default:
                    break;
            }
        }
    };

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sec);

        tv = (TextView) this.findViewById(R.id.editText1);
        b = (Button) this.findViewById(R.id.button1);
        ht = new HandlerTest(this);
       
        b.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                ht.init();
                ht.sendMsg(); // 发送信息
            }
        });


    }
}



import android.app.Activity;
import android.os.Handler;
import android.os.Message;

public class HandlerTest {
    private Handler handler = null;

    private SecActivity mainActivity = null;

    public HandlerTest(Activity ac) {
        mainActivity = (SecActivity) ac;
    }

    public void init() {// 初始化
        handler = mainActivity.getHandler();
    }

    public void sendMsg() {// 发送信息
        Message msg = new Message();
        msg.what = SecActivity.TEST;
        handler.sendMessage(msg);
    }
}

[解决办法]
其实最主要的思想还是在HandlerTest? 保存一个activity的实例对象,然后调用回去

热点排行