指定的子项已在膨胀的视图中出现父错误

use*_*869 4 android dialog view android-layout android-inflate

需要立即帮助!! 用来工作正常的代码,但过了一段时间我注意到评级没有t work anymore and gives "the specified child already has a parent, call removeView() first..." on thealertDialog.show();`line:

///// Rating bar initialising
    Context mContext = ShowActivity.this;
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    layout = inflater.inflate(R.layout.custom_rate_dialog, (ViewGroup) findViewById(R.id.layout_root));

    final RatingBar rating_indicator = (RatingBar)findViewById(R.id.rating_bar_cafe_indicator);
    final float current_rating = (float)mDbHelper.getInt(mRowId, type, RATE_COLUMN);
    rating_indicator.setRating(current_rating);


    rateDialogBuilder = new AlertDialog.Builder(ShowActivity.this);
    rateDialogBuilder.setView(layout);
    rateDialogBuilder.setCancelable(false);
    rateDialogBuilder.setIcon(R.drawable.rate_star_med_on);
    rateDialogBuilder.setTitle("RATE IT!");
    rateDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            rating_indicator.setRating(mDbHelper.getInt(mRowId, type, RATE_COLUMN));
            ((ViewGroup)layout.getParent()).removeView(layout);
            dialog.cancel();
        }
    });

    ratingText = (TextView) layout.findViewById(R.id.rate_text);
    rating = (RatingBar) layout.findViewById(R.id.rating_bar_cafe);
    rating.setRating(current_rating);
    rating.setStepSize(1);
    rating.setOnRatingBarChangeListener(ShowActivity.this);

    if ((int)current_rating != 0) ratingText.setText("Your rating: " + (int)current_rating); 

    Button rateButton = (Button) findViewById(R.id.button_rate); 
    rateButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {

            AlertDialog alertDialog = rateDialogBuilder.create(); 
            alertDialog.show();

        }
    });

    //////
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我打电话removeAllViews()removeView()就在alertDialog.show();它没有崩溃但打开搞砸对话,我可以看到评级和当前活动或smth.此问题可能是代码中的其他地方,因为这曾经工作正常,任何想法我应该寻找什么或如何更改它使其工作?

Lux*_*ode 10

您得到的错误是您已经将View父级添加到父级后添加到父级.

看看你的代码,它看起来像,

layout = inflater.inflate(R.layout.custom_rate_dialog, (ViewGroup) findViewById(R.id.layout_root));
Run Code Online (Sandbox Code Playgroud)

将custom_rate_dialog添加到layout_root.然后,当你这样做时,你将它添加到另一个父母rateDialogBuilder.setView(layout);

如果你只是想夸大该布局将其设置为View用于Dialog然后就做

layout = inflater.inflate(R.layout.custom_rate_dialog, null);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这可能是更好的做法,但问题是我碰巧以某种方式将 android:id="@+id/layout_root" 添加到主要活动的布局 xml ......愚蠢的我花了 4 个小时才注意到 (2认同)