为了账号安全,请及时绑定邮箱和手机立即绑定

请老师帮忙看下代码,目前的问题是,点击任何的待选文字按钮,都不会隐藏

这是自定义GridView的代码

	@Override
		public View getView(int postion, View v, ViewGroup arg2) {
			final WordButton wb ;
			if(null==v){
				wb = dataList.get(postion);
				wb.setIndex(postion);
				v = View.inflate(context,R.layout.word_selected_item, null);
				if(wb.getButtonView()==null){					 		 				
					wb.setButtonView((Button) v.findViewById(R.id.btn_word));
					wb.getButtonView().setOnClickListener(new OnClickListener() {
						
						@Override
						public void onClick(View arg0) {
							//文字按钮点击事件
							wordbuttonClick.onWordButtonClickListener(wb);
						}
					});
				}
				v.setTag(wb);
			}else{
				wb = (WordButton) v.getTag();
			}
			wb.getButtonView().setText(wb.getWordText());
			Animation animation = AnimationUtils.loadAnimation(context, R.anim.word_visable_anim);
			animation.setStartOffset((index++)*50);
			v.startAnimation(animation);
			return v;
		}

点击gridView中的文字按钮事件

/**
	 * 待选文字按钮点击事件
	 */
	@Override
	public void onWordButtonClickListener(WordButton wordButton) {
		for (int i = 0; i < mSelectedWordButtons.size(); i++) {
			if (TextUtils.isEmpty(mSelectedWordButtons.get(i).getWordText())) {
				// 设置显示被选框文字
				mSelectedWordButtons.get(i).setWordText(
						wordButton.getWordText()); 
				mSelectedWordButtons.get(i).setVisable(true);
				mSelectedWordButtons.get(i).getButtonView()
						.setText(wordButton.getWordText());
				mSelectedWordButtons.get(i).setIndex(wordButton.getIndex());

				// 设置点击的文字对象隐藏				 
				setWordButtonVisable(wordButton,View.INVISIBLE);
				MyLogUtil.i(TAG, "被点击隐藏:"+ wordButton.isVisable());//这里打印出false
				
				checkPassbyAnswer();
				break;
			}
		}
	}

	/**
	 * 设置文字按钮的显示或不显示
	 * @param wordButton
	 * @param visable
	 */
	private void setWordButtonVisable(WordButton wordButton, int visable) {
		wordButton.setVisable(visable == View.VISIBLE ? true : false);
		wordButton.getButtonView().setVisibility(visable);
	}


正在回答

代码语言

6 回答

现有的代码看起来没什么问题,问题应该出自自定义的GridView中,你可以再自己检查一下代码,如果还是无法解决,你把整个工程的代码发上来,我帮你看一下

0 回复 有任何疑惑可以回复我~
#1

安少爷

这个如何解呢?相关代码已经贴上了
2014-10-27 回复 有任何疑惑可以回复我~

像这种情况,首先需要先判断一下你的button事件是否被响应,你可以在点击时间里增加log来查看,如果事件可以被响应,才继续看其他的代码逻辑是否有问题

0 回复 有任何疑惑可以回复我~
//自定义GridView
public class MyGridView extends GridView {
	
	public static final int WORDCOUNT = 21;
	private static final String TAG = "MyGridView";
	private IWordButtonClickListener mWordbuttonClick;
	
	private MyGridAdapter mAdapter;
	private Context mContext;
	
	private List<WordButton> mDataList = new ArrayList<WordButton>();//数据源

	public MyGridView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.mContext = context;
		mAdapter = new MyGridAdapter();
		setAdapter(mAdapter);
	}
	
	/**
	 * 注册wordbutton事件
	 * @param wordbuttonClick
	 */
	public void registWordButtonClick(IWordButtonClickListener wordbuttonClick){
		this.mWordbuttonClick = wordbuttonClick;
	}
	
	
	 /**
	  * 更新数据源
	  * @param dataList
	  */
	public void updateData(List<WordButton> dataList){
		this.mDataList = dataList;
		 
		//重新设置数据源
		setAdapter(mAdapter);
	}
	
	 
	private class MyGridAdapter extends BaseAdapter{

	
		private Animation animation;

		@Override
		public int getCount() {
			return mDataList.size();
		}

		@Override
		public View getView(int postion, View v, ViewGroup arg2) {			
			final WordButton holder ;
			if(null==v){
				holder = mDataList.get(postion);
				holder.setIndex(postion);
				v = View.inflate(mContext,R.layout.word_selected_item, null);
				animation = AnimationUtils.loadAnimation(mContext, R.anim.word_visable_anim);
				animation.setStartOffset(postion*50);
				if(holder.getButtonView()==null){					 		 				
					holder.setButtonView((Button) v.findViewById(R.id.btn_word));
					holder.getButtonView().setOnClickListener(new OnClickListener() {
						
						@Override
						public void onClick(View arg0) {							 
							//文字按钮点击事件
							mWordbuttonClick.onWordButtonClickListener(holder);
						}
					});
				}
				v.setTag(holder);
			}else{
				holder = (WordButton) v.getTag();
			}
			holder.getButtonView().setText(holder.getWordText());
			v.startAnimation(animation);
			return v;
		}
		
		@Override
		public Object getItem(int postion) {
			return mDataList.get(postion);
		}

		@Override
		public long getItemId(int postion) {
			return postion;
		}
		
	}

}


0 回复 有任何疑惑可以回复我~
	 
	/**
	 * 删除文字需要的金币
	 * @return
	 */
	private int getDeleteCoin(){
		return getResources().getInteger(R.integer.delete_money );
	}

	/**
	 * 删除待选文字,且金币减少
	 */
	private void handelDelTheWord() {
		//减少金币
		if(handelCoins(-getDeleteCoin())){
			//删除随机一个待选文字
			setWordButtonVisable(findNoAnswer(),View.INVISIBLE);			
		}else{
			//提示金币数不足
			showCustomDialog(ID_DIALOG_LAKE_COIN);
		}
	}
	
	/**
	 * 找到不是答案的文字返回
	 * @return
	 */
	private WordButton findNoAnswer(){
		Random rd = new Random();
		for(int i=0;i<mAllWordButtons.size();i++){
			int index = rd.nextInt(mAllWordButtons.size());
			if(!mCurrentSong.getSongName().contains(mAllWordButtons.get(index).getWordText())){
				return mAllWordButtons.get(index);
			}
		}
		return null;
	}

	/**
	 * 处理金币的增加或减少
	 * @param coins 增加或减少的金币
	 */
	private boolean  handelCoins(int coins) {
		int mCurrentConis = Integer.valueOf(mTvCoins.getText().toString()).intValue();
		if(hasEnoughCoins(mCurrentConis,coins)){
			mTvCoins.setText(String.valueOf(mCurrentConis+coins));
			return true;
		}
		return false;
	}
	
	/**
	 * 是否有足够的金币
	 * @return
	 */
	private boolean hasEnoughCoins(int mCurrentConis,int coins){		 
		if(mCurrentConis<Math.abs(coins)){
			return false;
		} 
		return true;
	}

	/**
	 * 根据歌曲名设置选择框显示
	 * 
	 * @return
	 */
	private List<WordButton> getSelectedWords() {
		List<WordButton> dataList = new ArrayList<WordButton>();
		 
		mCurrentSong = new Song();
		mCurrentSong.setFileName(Const.Songs[mCurrentIndex][0]);
		mCurrentSong.setSongName(Const.Songs[mCurrentIndex][1]);
		for (int i = 0; i < mCurrentSong.getSongNameLength(); i++) {
			final WordButton wb = new WordButton();
			View v = View.inflate(this, R.layout.word_selected_item, null);
			wb.setButtonView((Button) v.findViewById(R.id.btn_word));
			wb.getButtonView().setText("");
			wb.getButtonView().setTextColor(Color.WHITE);
			wb.getButtonView().setBackgroundResource(R.drawable.game_wordblank);
			wb.setVisable(false);
			wb.getButtonView().setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					if(!TextUtils.isEmpty(wb.getWordText())){
						wb.setVisable(false);
						wb.getButtonView().setText("");
						wb.setWordText("");
						
						// 设置待选框显示				 
						setWordButtonVisable(mAllWordButtons.get(wb.getIndex()),View.VISIBLE);
					}
				}
			});
			dataList.add(wb);
		}
		return dataList;
	}

	/**
	 * 初始化待选文本
	 */
	private void initCurrentWords() {
		//清空被选框
		llContainWord.removeAllViews();
		// 根据歌曲名获取答案框对象
		mSelectedWordButtons = getSelectedWords();
		// 设置答案框显示大小
		LayoutParams params = new LayoutParams(60, 60);
		params.rightMargin = 5;
		for (int i = 0; i < mSelectedWordButtons.size(); i++) {
			llContainWord.addView(mSelectedWordButtons.get(i).getButtonView(),
					params);
		}
		tv_current_index.setText(String.valueOf(mCurrentIndex+1));
		// 获取数据
		mAllWordButtons = getWords();
		// 更新待选文本
		gvWords.updateData(mAllWordButtons);
		
		startPlayMusic();
	}

	/**
	 * 获取所有待选数据
	 * 
	 * @return
	 */
	private List<WordButton> getWords() {
		List<WordButton> dataList = new ArrayList<WordButton>();
		WordButton wb;
		// 将歌曲名填充待选数据中
		for (int i = 0; i < mCurrentSong.getSongNameLength(); i++) {
			wb = new WordButton();
			wb.setWordText(mCurrentSong.getSongName().charAt(i) + "");
			dataList.add(wb);
		}
		// 随机生成中文填充到待选数据中
		for (int i = mCurrentSong.getSongNameLength(); i < MyGridView.WORDCOUNT; i++) {
			wb = new WordButton();
			wb.setWordText(StringUtil.CreateSingleString());
			dataList.add(wb);
		}
		// 使用默认随机源对指定列表进行置换
		Collections.shuffle(dataList);
		return dataList;
	}
	
	/**
	 * 检查答案是否过关
	 */
	private void checkPassbyAnswer(){
		StatusAnswer result = checkTheAnswer();
		switch(result){
			case STATUS_RIGHT:
				//处理过关逻辑
				handlerPassEvent();
					break; 
			case STATUS_ERROR:
				//答案错误,闪烁文字提示
				showRedTip();
				break;
			case STATUS_INCOMPLEATE:
				//答案不完整处理逻辑
				changeSelectWordColor();
			     break;
		}
	}
	
	/**
	 * 处理过关事件
	 */
	private void handlerPassEvent() {
		//关闭未结束的盘片动画
		mPan.clearAnimation();
		//结束正播放的音乐
//		MyPlayerUtil.stopMusic(this);
		
		if(mCurrentIndex == Const.Songs.length-1){
			//显示通关界面
			CommonUtil.enterActivity(this, AllPassActivity.class);
		}else{
			//显示过关界面
			final LinearLayout ll_pass = (LinearLayout) findViewById(R.id.layout_pass);
			if(null!=ll_pass){
				ll_pass.setVisibility(View.VISIBLE);
				mTvPassAnswer = (TextView) findViewById(R.id.tv_answer);
				if(null!=mTvPassAnswer){
					mTvPassAnswer.setText(mCurrentSong.getSongName());
				}
				mTvPassIndex = (TextView) findViewById(R.id.tv_pass_index);
				if(null!=mTvPassIndex){
					mTvPassIndex.setText(String.valueOf(mCurrentIndex+1));
				}
				ImageButton btnNext = (ImageButton) findViewById(R.id.btn_next);
				btnNext.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View arg0) {
						//关卡加1
						mCurrentIndex++;
						//重新初始化数据
						initCurrentWords();
						//隐藏过关界面
						ll_pass.setVisibility(View.INVISIBLE);
					}
				});
			}		
		}
	}

	/**
	 * 改变选择的文字为白色
	 */
	private void changeSelectWordColor(){
		for(int i=0;i<mSelectedWordButtons.size();i++){
			mSelectedWordButtons.get(i).getButtonView().setTextColor(Color.WHITE);
		}
	}
	
	/**
	 * 红色闪烁提示(也就是紅色和白色頻繁切換)
	 */
	private void showRedTip() {
		TimerTask task = new TimerTask() {		
			boolean mChange = false;
			int count = 0;
			@Override
			public void run() {
				runOnUiThread(new Runnable() {					
					@Override
					public void run() {
						if(++count>COUNT){
							return;
						}
						for(int i=0;i<mSelectedWordButtons.size();i++){
							mSelectedWordButtons.get(i).getButtonView().setTextColor(mChange?Color.RED:Color.WHITE);
						}
						mChange = !mChange;
					}
				});				
			}
		};
		Timer timer = new Timer();
		timer.schedule(task, 1, 300);
	}

	/**
	 * 检查答案,返回结果
	 * @return
	 */
	private StatusAnswer checkTheAnswer(){
		//检查已选择框是否为空
		for(int i=0;i<mSelectedWordButtons.size();i++){
			if(TextUtils.isEmpty(mSelectedWordButtons.get(i).getWordText())){
				return StatusAnswer.STATUS_INCOMPLEATE;
			}
		}
		StringBuilder str = new StringBuilder();
		for(int i=0;i<mSelectedWordButtons.size();i++){
			 str.append(mSelectedWordButtons.get(i).getWordText());
		}
		return str.toString().equals(mCurrentSong.getSongName())?StatusAnswer.STATUS_RIGHT:StatusAnswer.STATUS_ERROR;
	}

	/**
	 * 待选文字按钮点击事件
	 */
	@Override
	public void onWordButtonClickListener(WordButton wordButton) {
		MyLogUtil.i(TAG, "被点击的待选文字:"+ wordButton.getWordText());
		for (int i = 0; i < mSelectedWordButtons.size(); i++) {
			if (TextUtils.isEmpty(mSelectedWordButtons.get(i).getWordText())) {
				// 设置显示被选框文字
				mSelectedWordButtons.get(i).setWordText(
						wordButton.getWordText()); 
				mSelectedWordButtons.get(i).setVisable(true);
				mSelectedWordButtons.get(i).getButtonView()
						.setText(wordButton.getWordText());
				mSelectedWordButtons.get(i).setIndex(wordButton.getIndex());

				// 设置点击的文字对象隐藏				 
				setWordButtonVisable(wordButton,View.INVISIBLE);
				MyLogUtil.i(TAG, "被点击文字按钮隐藏wordButton.isVisable():"+ wordButton.isVisable());//这里打印出false 
				checkPassbyAnswer();
				break;
			}
		}
	}

	/**
	 * 设置文字按钮的显示或不显示
	 * @param wordButton
	 * @param visable
	 */
	private void setWordButtonVisable(WordButton wordButton, int visable) {
		wordButton.setVisable(visable == View.VISIBLE ? true : false);
		wordButton.getButtonView().setVisibility(visable);
	}

	/**
	 * 开始播放音乐
	 */
	private void startPlayMusic() {
		mbtnPlay.setVisibility(View.INVISIBLE);
		// 拉杆动画in
		mIvpin.startAnimation(mPinInAnimation);
		 
		// 开始播放歌曲
		MyPlayerUtil.playMusic(MainActivity.this, mCurrentSong.getFileName());
	}
}


0 回复 有任何疑惑可以回复我~
  public class MainActivity extends Activity implements IWordButtonClickListener {

	private static final String TAG = "MainActivity";
	private ImageButton mbtnPlay;
	private ImageView mIvpin;
	private ImageView mPan;
	private MyGridView gvWords;
	private LinearLayout llContainWord;// 被选框的容器
	private TextView mTvCoins;//当前金币显示控件
	private TextView tv_current_index;//当前界面显示的关数控件
	
	private TextView mTvPassAnswer;//过关界面显示歌曲名的控件
	private TextView mTvPassIndex;//过关界面显示的关卡数
	private ImageButton mBtnBack;//返回按钮
	
	
	private List<WordButton> mAllWordButtons;// 所有待选文字对象集合
	private List<WordButton> mSelectedWordButtons;// 被选文字对象集合
	
	private static final int COUNT = 4;//执行闪烁次数

	private Song mCurrentSong;// 当前歌曲
	private int mCurrentIndex = 0;// 当前关卡

	private Animation mPinInAnimation;
	private Animation mPanAnimation;
	private Animation mPinOutAnimation;
	
	//对话框类别标识
	private final static int ID_DIALOG_DELETE_WORD =1;
	private final static int ID_DIALOG_TIP_ANSWERS =2;
	private final static int ID_DIALOG_LAKE_COIN =3;
	private final static int ID_DIALOG_BACK =4;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		llContainWord = (LinearLayout) findViewById(R.id.ll_word_layout);
		mIvpin = (ImageView) findViewById(R.id.imageView2);
		mPan = (ImageView) findViewById(R.id.imageView1);
		mTvCoins = (TextView) findViewById(R.id.tv_all_coins);
		tv_current_index = (TextView) findViewById(R.id.tv_current_index);
		
		
		//设置拉杆移入动画
		mPinInAnimation = AnimationUtils.loadAnimation(this,
				R.anim.pin_in_animation);		
		mPinInAnimation.setAnimationListener(new AnimationListener() {

			@Override
			public void onAnimationStart(Animation arg0) {
			}

			@Override
			public void onAnimationRepeat(Animation arg0) {
			}

			@Override
			public void onAnimationEnd(Animation arg0) {
				// 执行唱片动画
				mPan.startAnimation(mPanAnimation);
			}
		});

		//设置拉杆移出动画
		mPinOutAnimation = AnimationUtils.loadAnimation(this,
				R.anim.pin_out_animation);
		
		//设置盘片动画
		mPanAnimation = AnimationUtils.loadAnimation(this,
				R.anim.pan_start_rote);
		mPanAnimation.setAnimationListener(new AnimationListener() {

			@Override
			public void onAnimationStart(Animation arg0) {
			}

			@Override
			public void onAnimationRepeat(Animation arg0) {
			}

			@Override
			public void onAnimationEnd(Animation arg0) {
				//结束正播放的音乐
				MyPlayerUtil.stopMusic(MainActivity.this);
				// 播放按钮显示
				mbtnPlay.setVisibility(View.VISIBLE);
				// 拉杆归位
				mIvpin.startAnimation(mPinOutAnimation);
			}
		});

		//播放按钮事件
		mbtnPlay = (ImageButton) findViewById(R.id.btn_play_start);
		mbtnPlay.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				startPlayMusic();
			}
		});
		
		//退出事件
		mBtnBack = (ImageButton) findViewById(R.id.btn_title_back);
		mBtnBack.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				showCustomDialog(ID_DIALOG_BACK);
			}
		});

		gvWords = (MyGridView) findViewById(R.id.mgv_wordselected);
		// 注册wordbutton事件
		gvWords.registWordButtonClick(this);
		
		//初始化待选文本
		initCurrentWords();
		
		//处理删除待选文字按钮事件
		handleDelCoinsEvent();
		
		//提示答案按钮事件
		handleTipAnswerEvent();
	}
	
	@Override
	protected void onPause() {		 
		//关闭未结束的盘片动画
		mPan.clearAnimation();		
		super.onPause();
	}
	
	/**
	 * 显示自定义对话框
	 * @param action
	 */
	private void showCustomDialog(int action){
		
		switch (action) {
			case ID_DIALOG_DELETE_WORD:
				CommonUtil.showDialog(MainActivity.this,"刪除待选文字将损失"+getDeleteCoin()+"个金币", new IButtonClickListener() {
					
					@Override
					public void onButtonClickEvent(View view) {
						//删除待选文字,且减少金币
						handelDelTheWord();				
					}
				});
				break;
			case ID_DIALOG_LAKE_COIN://金币不足提示
				CommonUtil.showDialog(MainActivity.this,"金币不足,请往商城充值", new IButtonClickListener() {
					
					@Override
					public void onButtonClickEvent(View view) {
						 	
					}
				});
				break;
			case ID_DIALOG_TIP_ANSWERS:
				CommonUtil.showDialog(MainActivity.this,"提示答案将花费"+getTipCoin()+"个金币", new IButtonClickListener() {
					
					@Override
					public void onButtonClickEvent(View view) {
						handelTipTheWord();	
					}
				});
				break;
			case ID_DIALOG_BACK:
				CommonUtil.showDialog(MainActivity.this,"确定要退出?", new IButtonClickListener() {
					
					@Override
					public void onButtonClickEvent(View view) {
						System.exit(0);
					}
				});
				break;
		}
 
	}
	
	/**
	 * 处理提示答案事件
	 */
	private void handleTipAnswerEvent() {
		ImageButton btnTipWord = (ImageButton) findViewById(R.id.btn_tip_word);
		btnTipWord.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				showCustomDialog(ID_DIALOG_TIP_ANSWERS);			
			}
		});
	}

	/**
	 * 提示答案花费的金币
	 * @return
	 */
	private int getTipCoin(){
		return getResources().getInteger(R.integer.delete_money);
	}
	
	/**
	 * 提示答案,减少金币
	 */
	protected void handelTipTheWord() {
		//返回答案文字
		WordButton answer = findIsAnswer();
		if(null!=answer){
			//减少金币
			if(handelCoins(-getTipCoin())){
				//答案显示在被选框中
				onWordButtonClickListener(answer);
			}
		}
	}
	
	/**
	 * 查找是答案的文字
	 * @return 返回答案文字
	 */
	private WordButton findIsAnswer(){
		Random rd =new Random();
		for(int i=0;i<mSelectedWordButtons.size();i++){
			//如果文字为空或隐藏就continue
			if(!TextUtils.isEmpty(mSelectedWordButtons.get(i).getWordText())){
				continue;
			}
			while(true){				
				int index = rd.nextInt(mAllWordButtons.size());
				if(mAllWordButtons.get(index).getWordText().equals(mCurrentSong.getSongName().charAt(i)+"")){
					return mAllWordButtons.get(index);
				}
			}
		}
		return null;
	}

	/**
	 * 处理删除待选文字按钮事件
	 */
	private void handleDelCoinsEvent(){
		ImageButton btnDelWord = (ImageButton) findViewById(R.id.btn_del_word);
		btnDelWord.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				
				showCustomDialog(ID_DIALOG_DELETE_WORD);
			}
		});
	}
0 回复 有任何疑惑可以回复我~

按钮点击事件是会触发的,答案框中也显示了被点击的文字,被点击的待选按钮也设置了隐藏,但界面上就是没有效果

/**
	 * 待选文字按钮点击事件
	 */
	@Override
	public void onWordButtonClickListener(WordButton wordButton) {
		MyLogUtil.i(TAG, "被点击的待选文字:"+ wordButton.getWordText());
		for (int i = 0; i < mSelectedWordButtons.size(); i++) {
			if (TextUtils.isEmpty(mSelectedWordButtons.get(i).getWordText())) {
				// 设置显示被选框文字
				mSelectedWordButtons.get(i).setWordText(
						wordButton.getWordText()); 
				mSelectedWordButtons.get(i).setVisable(true);
				mSelectedWordButtons.get(i).getButtonView()
						.setText(wordButton.getWordText());
				mSelectedWordButtons.get(i).setIndex(wordButton.getIndex());

				// 设置点击的文字对象隐藏				 
				setWordButtonVisable(wordButton,View.INVISIBLE);
				MyLogUtil.i(TAG, "被点击文字按钮隐藏wordButton.isVisable():"+ wordButton.isVisable());//这里打印出false 
				//checkPassbyAnswer();
				break;
			}
		}
	}

打印的log信息:

10-21 14:55:15.640: I/MainActivity(23168): 被点击的待选文字:白

10-21 14:55:15.640: I/MainActivity(23168): 被点击文字按钮隐藏wordButton.isVisable():false


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android猜歌游戏是这样炼成的
  • 参与学习       27735    人
  • 解答问题       422    个

手把手教你完成一款猜歌类游戏,向你展示游戏实现的全部细节

进入课程
意见反馈 帮助中心 APP下载
官方微信