所以我正在编写的应用程序有两个(到目前为止)位于 fragment 中的搜索栏。评级栏位于主布局文件中。我需要发生的是评级栏进度根据 SeekBars 的值进行更改。这是代码,以便您有更好的想法:
Java 文件 fragment
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() New Host Connection established 0xb7ca38d0, tid 938 W/EGL_emulation(938): eglSurfaceAttrib not implemented D/OpenGLRenderer(938): Enabling debug mode 0 E/InputEventReceiver(938): Exception dispatching input event. Shutting down VM W/dalvikvm(938): threadid=1: thread exiting with uncaught exception (group=0xb3b0db90) D/dalvikvm(938): GC_FOR_ALLOC freed 94K, 6% free 3184K/3360K, paused 31ms, total 37ms E/AndroidRuntime(938): FATAL EXCEPTION: main E/AndroidRuntime(938): Process: com.example.tipquiz, PID: 938 E/AndroidRuntime(938): java.lang.NullPointerException E/AndroidRuntime(938): at com.example.tipquiz.QuizFragment.onProgressChanged(QuizFragment.java:50) E/AndroidRuntime(938): at android.widget.SeekBar.onProgressRefresh(SeekBar.java:91) E/AndroidRuntime(938): at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:655) E/AndroidRuntime(938): at android.widget.ProgressBar.refreshProgress(ProgressBar.java:667) E/AndroidRuntime(938): at android.widget.ProgressBar.setProgress(ProgressBar.java:714) E/AndroidRuntime(938): at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:451) E/AndroidRuntime(938): at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:379) E/AndroidRuntime(938): at android.view.View.dispatchTouchEvent(View.java:7690) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) E/AndroidRuntime(938): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) E/AndroidRuntime(938): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2066) E/AndroidRuntime(938): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) E/AndroidRuntime(938): at android.app.Activity.dispatchTouchEvent(Activity.java:2457) E/AndroidRuntime(938): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2014) E/AndroidRuntime(938): at android.view.View.dispatchPointerEvent(View.java:7870) E/AndroidRuntime(938): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3919) E/AndroidRuntime(938): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3808) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) E/AndroidRuntime(938): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3510) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) E/AndroidRuntime(938): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3567) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) E/AndroidRuntime(938): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) E/AndroidRuntime(938): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5520) E/AndroidRuntime(938): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5500) E/AndroidRuntime(938): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5471) E/AndroidRuntime(938): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5594) E/AndroidRuntime(938): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) E/AndroidRuntime(938): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) E/AndroidRuntime(938): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174) E/AndroidRuntime(938): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5573) E/AndroidRuntime(938): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5613) E/AndroidRuntime(938): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) E/AndroidRuntime(938): at android.view.Choreographer.doCallbacks(Choreographer.java:562) E/AndroidRuntime(938): at android.view.Choreographer.doFrame(Choreographer.java:530) E/AndroidRuntime(938): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) E/AndroidRuntime(938): at android.os.Handler.handleCallback(Handler.java:733) E/AndroidRuntime(938): at android.os.Handler.dispatchMessage(Handler.java:95) E/AndroidRuntime(938): a
最佳答案
在主要 Activity 中:
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;
}
关于java - 评级栏不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24922803/