有2个问题

有2个问题

问题在toggleButton按钮哪里,看注释说明

package com.imooc.basictestdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends Activity {
	private EditText name;
	private RadioGroup sex;
	private CheckBox hot, fish, sour;
	private SeekBar seekBar;
	private Button find;
	private ImageView imageView;
	private ToggleButton toggleButton;
	private List<Food> lists_food;
	private List<Food> lists_get;
	private Person person;
	private RadioGroupListener radioGroupListener;
	private boolean isFish;
	private boolean isHot;
	private boolean isSour;
	private CheckBoxListener checkBoxListener;
	private int price = 30;
	private SeekBarListener seekBarListener;
	private ButtonListener buttonListener;
	private int count;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_food);
		// 初始化控件
		initView();
		// 初始化数据
		initData();
		// 为控件添加监听器
		setListener();
	}

	private void initView() {
		name = (EditText) findViewById(R.id.et_name);
		sex = (RadioGroup) findViewById(R.id.rg_sex);
		hot = (CheckBox) findViewById(R.id.cb_hot);
		fish = (CheckBox) findViewById(R.id.cb_fish);
		sour = (CheckBox) findViewById(R.id.cb_sour);
		seekBar = (SeekBar) findViewById(R.id.sb_price);
		seekBar.setProgress(30);
		find = (Button) findViewById(R.id.btn_find);
		toggleButton = (ToggleButton) findViewById(R.id.tb_click);
		toggleButton.setChecked(true);
		imageView = (ImageView) findViewById(R.id.iv_pic);
	}

	private void initData() {
		person = new Person();
		lists_get = new ArrayList<Food>();
		lists_food = new ArrayList<Food>();
		lists_food.add(new Food("麻辣香锅", 55, R.drawable.malaxiangguo, true,
				false, false));
		lists_food.add(new Food("水煮鱼", 48, R.drawable.shuizhuyu, true, true,
				false));
		lists_food.add(new Food("麻辣火锅", 80, R.drawable.malahuoguo, true, true,
				false));
		lists_food.add(new Food("清蒸鲈鱼", 68, R.drawable.qingzhengluyu, false,
				true, false));
		lists_food.add(new Food("桂林米粉", 15, R.drawable.guilin, false, false,
				false));
		lists_food.add(new Food("上汤娃娃菜", 28, R.drawable.wawacai, false, false,
				false));
		lists_food.add(new Food("红烧肉", 60, R.drawable.hongshaorou, false,
				false, false));
		lists_food.add(new Food("木须肉", 40, R.drawable.muxurou, false, false,
				false));
		lists_food.add(new Food("酸菜牛肉面", 35, R.drawable.suncainiuroumian,
				false, false, true));
		lists_food.add(new Food("西芹炒百合", 38, R.drawable.xiqin, false, false,
				false));
		lists_food.add(new Food("酸辣粉", 40, R.drawable.suanlatang, true, false,
				true));
	}

	private void setListener() {
		radioGroupListener = new RadioGroupListener();
		sex.setOnCheckedChangeListener(radioGroupListener);
		checkBoxListener = new CheckBoxListener();
		fish.setOnCheckedChangeListener(checkBoxListener);
		hot.setOnCheckedChangeListener(checkBoxListener);
		sour.setOnCheckedChangeListener(checkBoxListener);
		seekBarListener = new SeekBarListener();
		seekBar.setOnSeekBarChangeListener(seekBarListener);
		buttonListener = new ButtonListener();
		find.setOnClickListener(buttonListener);
		toggleButton.setOnClickListener(buttonListener);
	}

	class RadioGroupListener implements OnCheckedChangeListener {

		@Override
		public void onCheckedChanged(RadioGroup group, int checkedId) {
			// 当用户选择当前的RadioGroup组的Button时被触发
			switch (checkedId) {
			case R.id.rb_man:
				person.setSex("男");
				break;
			case R.id.rb_woman:
				person.setSex("女");
				break;
			}
			System.out.println("性别:" + person.getSex());
		}
	}

	class CheckBoxListener implements
			android.widget.CompoundButton.OnCheckedChangeListener {

		@Override
		public void onCheckedChanged(CompoundButton buttonView,
				boolean isChecked) {
			// 当控件状态改变时被触发
			CheckBox cbBox = (CheckBox) buttonView;
			switch (cbBox.getId()) {
			case R.id.cb_fish:
				if (isChecked) {
					isFish = true;
				} else {
					isFish = false;
				}
				break;
			case R.id.cb_sour:
				if (isChecked) {
					isSour = true;
				} else {
					isSour = false;
				}
				break;
			case R.id.cb_hot:
				if (isChecked) {
					isHot = true;
				} else {
					isHot = false;
				}
				break;
			}
			System.out.println("当前喜好:" + " 辣:" + isHot + " 海鲜:" + isFish
					+ " 酸:" + isSour);

		}

	}

	class SeekBarListener implements OnSeekBarChangeListener {

		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
		}

		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {

		}

		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {
			price = seekBar.getProgress();
			Toast.makeText(MainActivity.this, "价格:" + price,Toast.LENGTH_SHORT).show();
		}

	}

	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {

			switch (v.getId()) {
			case R.id.btn_find:// 寻找菜品按钮
				count = 0;
				lists_get.clear();
				checkData();
				if (!lists_get.isEmpty()) {//判断lists_get是否为空
					showView();
				} else {
					Toast.makeText(MainActivity.this, "未找到相关菜品",
							Toast.LENGTH_SHORT).show();
					imageView.setImageResource(R.drawable.ic_launcher);
				}
				toggleButton.setChecked(true);
				break;
			case R.id.tb_click:// toggleButton按钮
				/*
				 * 老师,这里跟我预想的有点不一样
				 * toggleButton.isChecked()这个方法是判断toggleButton是否为选中状态
				 * 我在点击寻找菜品按钮的时候就强制将toggleButton设置为true,那么第一次点击该按钮的时候,
				 * 按照我的想法按钮应该是选中状态,给person添加姓名、性别、菜品信息后吐司才对,结果是反着来的,给我搞糊涂了。
				 * 您看,我加了个!,代码才能正常运行,这是什么原因呢?
				 * 
				 * 还有一个问题,点击下一个按钮的时候明显能感到卡顿是因为什么原因?
				 */
				if (!toggleButton.isChecked()) {
					person.setName(name.getText().toString());
					if (sex.getCheckedRadioButtonId() == R.id.rb_man) {
						person.setSex("男");
					}else{
						person.setSex("女");
					}
					person.setFood(lists_get.get(count));
					Toast.makeText(MainActivity.this, person.toString(),
							Toast.LENGTH_SHORT).show();
					count++;
				} else {
					if (count < lists_get.size()) {
						showView();
					} else {
						Toast.makeText(MainActivity.this, "因为已到末位,所以从头显示",
								Toast.LENGTH_SHORT).show();
						lists_get.clear();
						count = 0;
						checkData();
						showView();
					}
				}
				break;
			}
		}

		private void checkData() {
			// 找出菜品
			for (int i = 0; i < lists_food.size(); i++) {
				Food food = lists_food.get(i);
				if ((food.getPrice() <= price)
						&& (food.isFish() == isFish && food.isHot() == isHot && food
								.isSour() == isSour)) {
					lists_get.add(food);
				}
			}
			System.out.println("*********" + lists_get.size());

		}

		//显示图片的方法
		private void showView() {
			// count值为要显示lists_get列表中第几个菜品的图片
			// count值从0开始,表示显示lists_get列表中第一次菜品的图片
			imageView.setImageResource(lists_get.get(count).getPic());
		}
	}
}


正在回答

登陆购买课程后可参与讨论,去登陆

3回答

布局文件没有什么问题,问题还是在java代码中,我单独把你的toggleButton在IDE中试过运行,没有出现你问题1中描述的问题,但是上述下一个点击后的代码中逻辑处理有点问题,你可以参照我的逻辑修改下代码再试试:

if (toggleButton.isChecked()) {
//判断count的值,如果count值小于集合个数-1,则count自增,否则count设为0并提示信息;
}else{
//为person设置数据并提示消息
}


  • 吴跃民 提问者 #1
    非常感谢!
    2017-06-08 17:53:39
提问者 吴跃民 2017-06-08 13:42:34
<Button
            android:id="@+id/btn_find"
            android:layout_width="305dp"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:layout_margin="5dp"
            android:layout_marginLeft="36dp"
            android:text="寻找菜品"
            android:textSize="22sp" />
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.96"
        android:background="#FFD9EC"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/iv_pic"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_margin="40dp"
            android:layout_weight="2.84"
            android:src="@drawable/ic_launcher" />

        <ToggleButton
            android:id="@+id/tb_click"
            android:layout_width="306dp"
            android:layout_height="50dp"
            android:layout_marginBottom="42dp"
            android:layout_marginLeft="24dp"
            android:background="#ADADAD"
            android:textOff="下一个"
            android:textOn="显示信息"
            android:textSize="22sp" />
</LinearLayout>


irista23 2017-06-07 14:34:22

从java代码来看,toggleButton应该一直是开启状态的,你布局文件中对他给默认值了吗?另外在ButtonListener中没有看到你下一个按钮的点击处理,卡顿的话先检查做没做耗时的操作,如果没有跟踪一下代码,具体看程序如何运行的

  • 提问者 吴跃民 #1
    在寻找菜品按钮代码中toggleButton.setChecked(true);给了toggleButton按钮默认值true,ButtonListener中下一个按钮的点击处理是有的,我用的if (!toggleButton.isChecked()) {}else{//这里就是下一个按钮}
    2017-06-07 19:28:39
  • irista23 回复 提问者 吴跃民 #2
    可以把布局文件贴出来,方便我们帮你调试
    2017-06-07 22:00:45
  • 提问者 吴跃民 回复 irista23 #3
    布局文件太长了,没发全贴出来,我就把关键的部分贴出来了
    2017-06-08 13:43:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师