【问题标题】:Google PlaceAutocompleteFragment crashes with errorGoogle PlaceAutocompleteFragment 因错误而崩溃
【发布时间】:2017-01-12 12:16:57
【问题描述】:

在我的应用程序主页中,google place 自动完成 fragment 在对话框栏中按下按钮时打开,该位置用于搜索查询。问题是当我尝试通过再次按下按钮来更改位置时,应用程序崩溃并出现以下错误。

*android.view.InflateException: Binary XML file line #24: Binary XML file line #24: Error inflating class fragment
Duplicate id 0x7f0e00db, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.location.places.ui.PlaceAutocompleteFragment*

这是按钮按下活动及其调用的方法。

case R.id.text_area:
            EditLocation();
            break;

private void EditLocation() {

    final Dialog dialog = new Dialog(context);
    dialog.setContentView(R.layout.area);
    dialog.setTitle("Please enter the location");
    PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)
            getFragmentManager().findFragmentById(R.id.autocomplete_fragment);


    ((EditText)autocompleteFragment.getView().findViewById(R.id.place_autocomplete_search_input)).setHint("Search Location");
    //((EditText)autocompleteFragment.getView().findViewById(R.id.place_autocomplete_search_input)).setTextSize(10.0f);
    //txtlocation=(TextView) findViewById(R.id.dialogLocationText);

    autocompleteFragment.setOnPlaceSelectedListener(this);
    Button dialogButtonSave = (Button) dialog.findViewById(R.id.btnOK);
    // if button is clicked, close the custom dialog
    dialogButtonSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //area=dialogLocation.getText().toString();
            location.setText(area);
            dialog.dismiss();
            //autocompleteFragment.setText("");

        }
    });
    dialog.show();


}

下面是xml代码

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">
    <android.support.v7.widget.CardView
        android:layout_width="fill_parent"
        android:layout_marginTop="10dp"
        android:layout_height="35dp"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="10dp"
        android:layout_weight=".335"
        android:gravity="center"
        android:textSize="13sp"
        android:background="@android:color/white"
        >

        <fragment
            android:id="@+id/autocomplete_fragment"
            android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.v7.widget.CardView>


<Button
    android:id="@+id/btnOK"
    android:layout_width="350dp"
    android:layout_margin="10dp"
    android:layout_height="35dp"
    android:text="OK"
    android:background="@drawable/custom_btn_orange"/>
</LinearLayout>

以下是按钮和片段如何操作的屏幕截图。

下面是logcat

E/AndroidRuntime: 致命异常: main 进程:com.itcastle.kleanify,PID:3659 android.view.InflateException: Binary XML file line #24: Binary XML file line #24: Error inflating class fragment 在 android.view.LayoutInflater.inflate(LayoutInflater.java:539) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Dialog.setContentView(Dialog.java:512) 在 com.itcastle.kleanify.WelcomeHomeTemp.EditLocation(WelcomeHomeTemp.java:533) 在 com.itcastle.kleanify.WelcomeHomeTemp.onClick(WelcomeHomeTemp.java:453) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:android.view.InflateException: Binary XML file line #24: Error inflating class fragment 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:515) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Dialog.setContentView(Dialog.java:512) 在 com.itcastle.kleanify.WelcomeHomeTemp.EditLocation(WelcomeHomeTemp.java:533) 在 com.itcastle.kleanify.WelcomeHomeTemp.onClick(WelcomeHomeTemp.java:453) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.IllegalArgumentException:二进制 XML 文件第 24 行:重复 id 0x7f0e00db、标签 null 或父 id 0xffffffff 与 com.google.android.gms.location.places.ui.PlaceAutocompleteFragment 的另一个片段 在 android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2205) 在 android.app.FragmentController.onCreateView(FragmentController.java:98) 在 android.app.Activity.onCreateView(Activity.java:5546) 在 android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:36) 在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:515) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Dialog.setContentView(Dialog.java:512) 在 com.itcastle.kleanify.WelcomeHomeTemp.EditLocation(WelcomeHomeTemp.java:533) 在 com.itcastle.kleanify.WelcomeHomeTemp.onClick(WelcomeHomeTemp.java:453) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) I/Process:发送信号。 PID:3659 SIG:9 应用程序终止。

我经历了很多问题,几乎所有的答案都是在onDestroyView() 中添加一些我没有的代码行。在第一次单击片段时完美运行,问题是当我再次按下按钮以更改应用程序完全粉碎的位置时。任何建议表示赞赏。谢谢。

【问题讨论】:

  • 编辑了问题。添加了日志猫。谢谢。
  • 找到任何解决方案了吗? @HasanSawan
  • 还没有。 @MayankBhatnagar
  • 如果您仍在搜索它,我现在可以使用它,我可以将我的调用对话框方法与 xml 一起发布
  • 请问。谢谢。 @MayankBhatnagar

标签: android android-fragments google-places-api


【解决方案1】:

在你的地图片段中试试这个:

 public void onDestroyView() {
    super.onDestroyView();
    FragmentManager fm = getActivity().getSupportFragmentManager();
    Fragment fragment = (fm.findFragmentById(R.id.map));
    FragmentTransaction ft = fm.beginTransaction();
    ft.remove(fragment);
    ft.commit();
}

【讨论】:

  • 我应该把这个放在哪里?在 Editlocation() 方法内部?
  • 在你的地方自动完成片段类..它是片段的委托方法,如 onCreate()
【解决方案2】:

这是同一个 dialog_xml 的代码

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="3dp"
    card_view:cardElevation="4dp"
    android:layout_marginBottom="2dp"
    card_view:contentPadding="1dp"
    android:layout_margin="2dp"
    tools:ignore="MissingPrefix"
    card_view:cardBackgroundColor="#fff">


<RelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_geofence"
        android:layout_width="match_parent"
        android:layout_marginRight="12dp"
        android:layout_marginLeft="12dp"
        android:layout_height="match_parent"
        tools:ignore="MissingPrefix"
        tools:context="in.gpstracar.gpstracker.GeofenceActivity">

        <Button
            android:text="Cancel"
            android:layout_width="match_parent"
            fontPath="fonts/arial.ttf"
            android:textColor="@color/text_color"
            android:background="#fff"
            android:layout_marginBottom="8dp"
            android:textStyle="bold"
            android:layout_marginTop="5dp"
            android:elevation="2dp"
            android:layout_below="@+id/addGeofenceBtn"
            android:layout_height="wrap_content"
            android:id="@+id/dismissbutton1"

             />

        <Button
            android:text="Select"
            android:layout_width="match_parent"
            fontPath="fonts/arial.ttf"
            android:textColor="#fff"
            android:textStyle="bold"
            android:layout_marginTop="20dp"
            android:background="@color/colorPrimary"
            android:layout_height="wrap_content"
            android:layout_below="@+id/setRadiusEditText"
            android:id="@+id/submit_buttom" />

        <fragment
            android:id="@+id/place_autocomplete_fragment"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:name="com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="53dp" />

        <TextView
            android:text="Dialog_Title"
            android:layout_width="wrap_content"
            fontPath="fonts/arial.ttf"
            android:textColor="@color/text_color"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_centerHorizontal="true"
            android:id="@+id/textView8"
            android:textStyle="normal|bold" />

    </RelativeLayout>

和 Inflating_Dialog 在活动中

private void OpeningDialog(){

    final SupportPlaceAutocompleteFragment places ;
    dialog = new Dialog(MainActivity.this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.geo_fence_dialog);


     places= (SupportPlaceAutocompleteFragment) getSupportFragmentManager()
            .findFragmentById(R.id.place_autocomplete_fragment);

    places.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {

            Toast.makeText(getApplicationContext(), place.getName() , Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Status status) {

            Toast.makeText(getApplicationContext(), status.toString(), Toast.LENGTH_SHORT).show();

        }
    });

    Button submitbutton = (Button) dialog.findViewById(R.id.submit_buttom);
    submitbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FragmentTransaction ft2 = getSupportFragmentManager()
                    .beginTransaction();
            ft2.remove(getSupportFragmentManager()
                    .findFragmentById(R.id.place_autocomplete_fragment));
            ft2.commit();
            dialog.dismiss();
        }
    });

    Button dialogButton = (Button) dialog.findViewById(R.id.dismissbutton1);
    dialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction ft2 = getSupportFragmentManager()
                    .beginTransaction();
            ft2.remove( getSupportFragmentManager()
                    .findFragmentById(R.id.place_autocomplete_fragment));
            ft2.commit();
            dialog.dismiss();
        }
    });

    dialog.show();
}

现在只需调用方法OpeningDialog() 使用该方法要记住的事情,您必须将对话框设置为setcancelablefalse,并提供一个按钮关闭对话框并删除上面的fragment。 如果你想将setcancelable 设置为true,那么你应该处理删除片段,如果你不删除片段,它会在第二次充气时出错。

如有任何疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2017-09-28
    • 2017-08-21
    • 2014-01-20
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多