【问题标题】:Android RatingBar onRatingChanged doesn't get calledAndroid RatingBar onRatingChanged 没有被调用
【发布时间】:2017-08-15 09:57:33
【问题描述】:

在我的 Android 应用中,我有一个显示 RatingBar 的 Fragment,它有一个 onRatingChanged 侦听器,它不响应 ratingbar 的变化。

这是我的代码:

rating_fragment.xml

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rating_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


    <RatingBar
        android:id="@+id/rating_fragment_ratingbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:stepSize="1"
        />

    <EditText
        android:layout_marginTop="16dp"
        android:id="@+id/rating_fragment_whatswrong"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="@string/rating_fragment_whatswrong"
        android:layout_gravity="center_horizontal"
        android:visibility="gone"
        tools:visibility="visible"
        />

</LinearLayout>

</android.support.v7.widget.CardView>

RatingFragment.java

public class RatingFragment extends DialogFragment implements RatingBar.OnRatingBarChangeListener{

private static final String TAG = RatingFragment.class.getSimpleName();
private View rootView;
private EditText mWhatsWrong;

@NonNull
@Override
public Dialog onCreateDialog (Bundle savedInstanceState) {
    // Create a new AlertDialog.Builder
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());

    // Get the layout inflater
    LayoutInflater layoutInflater = getActivity().getLayoutInflater();
    rootView = layoutInflater.inflate(R.layout.rating_fragment,null);

    // Inflate the layout
    builder.setView(R.layout.rating_fragment);
    builder.setTitle(getString(R.string.rating_fragment_title));

    initialize();
    return builder.create();
}

@Nullable
@Override
public View onCreateView (LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.rating_fragment,container,false);
    return rootView;
}



private void initialize(){
    RatingBar ratingBar = (RatingBar) rootView.findViewById(R.id.rating_fragment_ratingbar);
    mWhatsWrong = (EditText) rootView.findViewById(R.id.rating_fragment_whatswrong);

    ratingBar.setOnRatingBarChangeListener(this);
}


@Override
public void onRatingChanged (RatingBar ratingBar, float rating, boolean fromUser) {
    Toast.makeText(getContext(), String.valueOf(rating), Toast.LENGTH_SHORT).show();

    if(rating < 4.0f){
        mWhatsWrong.setVisibility(View.VISIBLE);
    } else {
        mWhatsWrong.setVisibility(View.GONE);
    }
}

预期行为: onRatingChanged() 方法被调用。

当前行为:即使我更改了小部件中的星星,也没有任何反应。

【问题讨论】:

  • 您可以在onCreateView()方法中添加initialize()方法并尝试一下。
  • @KeLiuyue 我试过了,但并没有改变情况:(
  • 嗨 Gio G.,我用你的代码试了一下。它成功了。你可以检查一下。只需在 onCreateView() 中添加 initialize() 方法。
  • 您好,KeLiuyue,我已经应用了更改,但正如我之前告诉您的那样,没有任何反应。我也在 Logcat W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed 中看到了这一点。会不会是问题?
  • 你好 Gio G.,我又编辑了。你可以试一试。

标签: java android ratingbar listeners


【解决方案1】:

试试这个。

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Create a new AlertDialog.Builder
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());

    // Get the layout inflater
    LayoutInflater layoutInflater = getActivity().getLayoutInflater();
    rootView = layoutInflater.inflate(R.layout.rating_fragment, null);

    // Inflate the layout
    builder.setView(R.layout.rating_fragment);
    builder.setTitle(getString(R.string.rating_fragment_title));
    // edited here
    // initialize();
    return builder.create();
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.rating_fragment, container, false);
    // edited here,add initialize() method
    initialize();
    return rootView;
}


private void initialize() {
    // edited here,add log info
    Log.e("RatingBar", "initialize start");
    RatingBar ratingBar = (RatingBar) rootView.findViewById(R.id.rating_fragment_ratingbar);
    mWhatsWrong = (EditText) rootView.findViewById(R.id.rating_fragment_whatswrong);

    // edited here
    ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
        @Override
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean b) {

            if (rating < 4.0f) {
                mWhatsWrong.setVisibility(View.VISIBLE);
            } else {
                mWhatsWrong.setVisibility(View.GONE);
            }

            Log.e("RatingBar", rating + "");
        }
    });
}

【讨论】:

  • 没有改变,在 Logcat Log.e("RatingBar", "initialize start"); 中出现,但在 onRatingChanged() 中的日志 Log.e("RatingBar", rating + ""); 没有出现。无论如何感谢您的回答。
  • 你可以再试一次。
  • 我解决了,显然我在写builder.setView(R.layout.rating_fragment); 时在onCreateDialog 方法中犯了一个错误,而不是通过rootView 已经以这种方式膨胀:builder.setView(rootView);
  • 还是谢谢你@KeLiuyue
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2017-01-24
  • 1970-01-01
  • 2017-10-28
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多