如何在AlertDialog中设置动态评级栏视图?

时间:2017-01-16 18:37:43

标签: android

首先它运行平稳,但当我再次点击它时它会停止

我在尝试在AlertDialog

中设置动态评分栏视图时遇到错误
  

java.lang.IllegalStateException:指定的子级已有父级。您必须首先在孩子的父母身上调用removeView()。

 rtb = LayoutInflater.from(getContext()).inflate(R.layout.ratingbar_dialog, null);
    rb = (RatingBar) rtb.findViewById(R.id.rtbDialog);

    ad = new AlertDialog.Builder(getContext());
    ad.setView(rtb);

    ll1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            ad.setMessage("Rate Price");

            ad.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                    dialogInterface.dismiss();
                }
            });
            ad.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    rtbPrice.setRating(rb.getRating());
                }
            });
            ad.show();
        }
    });

2 个答案:

答案 0 :(得分:2)

因为每次调用rtb时,都会创建一个新对话框,同时添加相同的视图inflate作为对话框内容(所以第一次有效,然后第二次出现异常)。
解决它:

  • 您可以将所有代码从setView移至onClick进入onClick方法
  • rtb内,删除if (rtb.getParent() instanceOf ViewGroup) { ((ViewGroup) rtb.getParent()).removeView(rtb); }的父母:
    import Alamofire struct JsonParameterEncoding: ParameterEncoding { private let jsonString: String init(jsonString: String) { self.jsonString = jsonString } func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { var urlRequest = urlRequest.urlRequest! if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") } urlRequest.httpBody = jsonString.data(using: .utf8) return urlRequest } }
  • 或重构您的代码,让它只创建并显示一个对话框。

答案 1 :(得分:1)

不要给view充气。 。 通过setContentView()设置xml,然后通过rating bar

访问FindviewbyId()