【问题标题】:Rating Bar not changing评分栏不变
【发布时间】:2014-09-15 08:45:03
【问题描述】:

所以我正在编写的应用程序有两个(到目前为止)位于片段中的搜索栏。评分栏位于主布局文件中。我需要做的是根据 SeekBars 的值更改评分栏进度。这是代码,所以你有一个更好的主意:

片段 Java 文件

package com.example.tipquiz;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class QuizFragment extends Fragment implements OnSeekBarChangeListener {

    SeekBar fqBar, cBar;
    TextView fqTV, cTV;
    TextView fqTVP, cTVP;
    RatingBar rb;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.quiz_fragment_layout, container,
                false);
        //Inflate the Main layout to access the RatingBar
        View mainView = inflater.inflate(R.layout.activity_main, container, false);
        //FoodQuality Bar
        fqBar = (SeekBar) view.findViewById(R.id.seekBarFQ);
        fqBar.setOnSeekBarChangeListener(this);
        fqTV = (TextView) view.findViewById(R.id.textViewFQ2);
        fqTVP = (TextView) view.findViewById(R.id.textViewFQP);

        //Cleanliness Bar
        cBar = (SeekBar) view.findViewById(R.id.seekBarC);
        cBar.setOnSeekBarChangeListener(this);
        cTV = (TextView) view.findViewById(R.id.textViewC2);
        cTVP = (TextView) view.findViewById(R.id.textViewCP);

        rb = (RatingBar) mainView.findViewById(R.id.ratingBar1);
        return view;


    }

    @Override
    public void onProgressChanged(SeekBar arg0, int progress, boolean fromUser) {
        switch(arg0.getId()) {

        case R.id.seekBarFQ:
            if(progress > 70 && progress < 90){
                fqTV.setText("Above Average - ");
                rb.setRating(4);
            }else if(progress > 40 && progress <= 70){
                fqTV.setText("Average - ");
            }else if(progress <= 40){
                fqTV.setText("Awful - ");
            }else if(progress > 90){
                fqTV.setText("Perfect - ");
            }
            fqTVP.setText(progress + "%");
            break;

        case R.id.seekBarC:
            if(progress > 70 && progress < 90){
                cTV.setText("Above Average - ");        
            }else if(progress > 40 && progress <= 70){
                cTV.setText("Average - ");
            }else if(progress <= 40){
                cTV.setText("Awful - ");
            }else if(progress > 90){
                cTV.setText("Perfect - ");
            }
            cTVP.setText(progress + "%");
            break;
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub

    }

}

主类

package com.example.tipquiz;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnRatingBarChangeListener{

    // Testing Stuff to show the rating value, will need to use later for maths
    static RatingBar rb;
    TextView tv;

    // The Image used as the DropDown button, Rotate code below
    ImageView dropDownButton;

    Boolean hasRotated = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        dropDownButton = (ImageView) findViewById(R.id.dropDownButton);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    FragmentManager fm = getFragmentManager();
    QuizFragment qf = new QuizFragment();

    public void dropDown(View view){
        if(hasRotated == false){
            FragmentTransaction ft = fm.beginTransaction();
            ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
            dropDownButton.setRotation(90);
            ft.add(R.id.quizFragment, qf);
            ft.show(qf);
            ft.commit();
            hasRotated = true;
        }else if(hasRotated == true){
            FragmentTransaction ft = fm.beginTransaction();
            ft.setCustomAnimations(android.R.animator.fade_out, android.R.animator.fade_out);
            dropDownButton.setRotation(0);
            hasRotated = false;
            ft.remove(qf);
            ft.commit();
        }
    }

    @Override
    public void onRatingChanged(RatingBar ratingBar, float rating,
            boolean fromTouch) {
        // final int numStars = ratingBar.getNumStars();
        tv.setText(rating + "/5.0");
    }
    // http://www.compiletimeerror.com/2013/08/android-rating-bar-example.html#.U7SZ5fldXm4
}

我尝试了很多方法,但我所做的大多数方法都会在 Eclipse 中出现错误或崩溃。我现在使用的方法没有崩溃或给出任何错误,但评分栏没有按预期改变。

我也尝试过简单地使用 MainActivity.rb.setProgress(4);在 if 语句中,但我遇到了这个崩溃:

D/(938): HostConnection::get() 新主机连接建立 0xb7ca38d0, tid 938 W/EGL_emulation(938): eglSurfaceAttrib 未实现 D/OpenGLRenderer(938):启用调试模式 0 E/InputEventReceiver(938):异常调度输入事件。 关闭虚拟机 W/dalvikvm(938):threadid=1:线程以未捕获的异常退出(组=0xb3b0db90) D/dalvikvm(938):GC_FOR_ALLOC 释放 94K,6% 释放 3184K/3360K,暂停 31ms,共 37ms E/AndroidRuntime(938):致命异常:主要 E/AndroidRuntime(938):进程:com.example.tipquiz,PID:938 E/AndroidRuntime(938): java.lang.NullPointerException E/AndroidRuntime(938):在 com.example.tipquiz.QuizFragment.onProgressChanged(QuizFragment.java:50) E/AndroidRuntime(938):在 android.widget.SeekBar.onProgressRefresh(SeekBar.java:91) E/AndroidRuntime(938):在 android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:655) E/AndroidRuntime(938):在 android.widget.ProgressBar.refreshProgress(ProgressBar.java:667) E/AndroidRuntime(938): 在 android.widget.ProgressBar.setProgress(ProgressBar.java:714) E/AndroidRuntime(938):在 android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:451) E/AndroidRuntime(938):在 android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:379) E/AndroidRuntime(938):在 android.view.View.dispatchTouchEvent(View.java:7690) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938):在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2066) E/AndroidRuntime(938):在 com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) E/AndroidRuntime(938):在 android.app.Activity.dispatchTouchEvent(Activity.java:2457) E/AndroidRuntime(938):在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2014) E/AndroidRuntime(938):在 android.view.View.dispatchPointerEvent(View.java:7870) E/AndroidRuntime(938):在 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3919) E/AndroidRuntime(938):在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3808) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) E/AndroidRuntime(938):在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3510) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) E/AndroidRuntime(938):在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3567) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) E/AndroidRuntime(938):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938):在 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5520) E/AndroidRuntime(938):在 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5500) E/AndroidRuntime(938):在 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5471) E/AndroidRuntime(938):在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5594) E/AndroidRuntime(938):在 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) E/AndroidRuntime(938):在 android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) E/AndroidRuntime(938):在 android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174) E/AndroidRuntime(938):在 android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5573) E/AndroidRuntime(938):在 android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5613) E/AndroidRuntime(938):在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) E/AndroidRuntime(938):在 android.view.Choreographer.doCallbacks(Choreographer.java:562) E/AndroidRuntime(938):在 android.view.Choreographer.doFrame(Choreographer.java:530) E/AndroidRuntime(938):在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) E/AndroidRuntime(938):在 android.os.Handler.handleCallback(Handler.java:733) E/AndroidRuntime(938):在 android.os.Handler.dispatchMessage(Handler.java:95) E/AndroidRuntime(938): 一个

【问题讨论】:

  • 移动搜索栏时文字会改变吗?
  • 是的,两个搜索栏上的文本变化都很好,它们彼此独立移动,这就是我想要的。但是,我发布的崩溃发生在 Food Quality 搜索栏进入 70% 文本区域时
  • @DtrollMC QuizFragment 的第 50 行?
  • 第 50 行是我设置评分的地方。
  • 有人可以帮忙吗?

标签: java android android-layout android-fragments android-seekbar


【解决方案1】:

MainActivity中:

public static int rating = 0;

private RatingBar rb;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    rb = (RatingBar) findViewById(R.id.ratingBar1);
    rb.setRating(rating);
}

QuizFragment 中: 删除这一行

rb = (RatingBar) mainView.findViewById(R.id.ratingBar1);

然后:

if (progress > 70 && progress < 90){
    fqTV.setText("Above Average - ");
    MainActivity.rating = 4;
}

【讨论】:

  • 非常聪明的想法,所以我尝试了这个,但评分栏仍然没有改变。我用 setProgress 尝试过同样的事情
  • @DtrollMC 尝试将此添加到 RatingBar android:isIndicator="false"
  • 不,这也不起作用。我还应该提到,当 SeekBars 达到 70 分时,它们似乎会变大一点。不是很相关,但我认为我应该分享。
【解决方案2】:

尝试放一个浮点值。而不是 4 尝试放 4f

【讨论】:

  • 其实我只是测试了一下,不管是int还是float。很抱歉给您带来不便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多