Fragment 未附加到 FragmentManager
Posted
技术标签:
【中文标题】Fragment 未附加到 FragmentManager【英文标题】:Fragment is not attached to the FragmentManager 【发布时间】:2020-02-06 01:50:37 【问题描述】:我尝试在显示为片段的 googlemap 上显示我的位置。片段布局代码为:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:background="@color/window_background_color"
android:clickable="false">
<!-- Toolbar -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
android:background="@color/primary_color"
android:elevation="1dp"
android:minHeight="?attr/actionBarSize"
android:titleTextAppearance="@style/TextAppearance.AppCompat.Body1"
app:popupTheme="@style/Theme.AppCompat">
<TextView
android:id="@+id/toolbar_title"
android:layout_
android:layout_
android:layout_alignParentStart="true"
android:layout_gravity="center"
android:layout_weight="1"
android:maxLines="1"
android:text="@string/toolbar"
android:textColor="@android:color/white"
android:textSize="24sp" />
</androidx.appcompat.widget.Toolbar>
<RelativeLayout
android:id="@+id/test"
android:layout_
android:layout_
android:layout_alignParentStart="true"
android:layout_below="@+id/toolbar"
android:background="#1c3049"
android:orientation="horizontal">
<Button
android:id="@+id/help"
android:layout_
android:layout_
android:background="?attr/colorAccent"
android:text="@string/help" />
<Spinner
android:id="@+id/spnCategory"
android:layout_
android:layout_
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:gravity="end" />
<TextView
android:id="@+id/mymess"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginStart="95dp"
android:gravity="center_vertical|center_horizontal"
android:textColor="@android:color/white"
android:textSize="14sp" />
</RelativeLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/fragment"
android:layout_
android:layout_
android:layout_below="@id/test"
android:orientation="vertical" />
片段从 mainActivity 显示:
FragmentTransaction mTransaction = getSupportFragmentManager().beginTransaction();
ActivityMap mFragment = new ActivityMap();
mTransaction.add(R.id.fragment, mFragment);
mTransaction.commit();
我从以下位置调用 getUserPosition:
@Override
public void onLocationChanged(Location location)
mCurrentLocation = location;
getUserPosition(location.getLatitude(), location.getLongitude());
我的 getUserPosition 代码是:
public void getUserPosition(double latitude, double longitude)
mCurrentLatitude = latitude;
mCurrentLongitude = longitude;
if (mIsMapVisible && isNetworkAvailable())
TextView mytext = Objects.requireNonNull(getActivity()).findViewById(R.id.mymess));
Geocoder geocoder = new Geocoder(getActivity(), Locale.ENGLISH);
List<Address> addresses;
try
addresses = geocoder.getFromLocation(mCurrentLatitude, mCurrentLongitude, 1);
if ((addresses.size()>0))
String str = addresses.get(0).getAddressLine(0);
if(str.contains(","))
mytext.setText(str.substring(0, str.indexOf(",")));
else
mytext.setText(str);
else
mytext.setText(R.string.no_adr);
catch (IOException e)
e.printStackTrace();
catch (NullPointerException e)
e.printStackTrace();
String temp = mCurrentLatitude + "," + mCurrentLongitude;
mytext.setText(temp);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
new LatLng(mCurrentLatitude, mCurrentLongitude),
Utils.ARG_DEFAULT_MAP_ZOOM_LEVEL);
mMap.animateCamera(cameraUpdate);
最后这是问题部分:
private boolean isNetworkAvailable()
ConnectivityManager connectivityManager
= (ConnectivityManager) getLayoutInflater().getContext().getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager.getActiveNetworkInfo() : null;
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
在这里我收到下一条错误消息:E/UncaughtException: java.lang.IllegalStateException: onGetLayoutInflater() 在 Fragment 附加到 FragmentManager 之前无法执行。
我第一次运行应用程序时完美运行。第二次我得到错误。依此类推,直到我的设备询问是否要关闭应用程序,因为他停止继续。我接受,下一次运行完美。然后……又是垃圾邮件问题。
有什么建议吗?
【问题讨论】:
【参考方案1】:Fragments
有自己的生命周期。在处理 Fragment 时,您应该始终考虑它们可能是分离的、隐藏的或它们的状态已经保存。
问题的发生可能是因为您过早收听位置更改事件。但是,即使您在注册位置侦听器时更改,最好以安全的方式获取Context
(或Activity
)(因为分离时,Context
/Actvity
将为空) .
所以,我建议:
private boolean isNetworkAvailable()
boolean result = false;
Context context = getContext();
if(context != null)
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager.getActiveNetworkInfo() : null;
result = activeNetworkInfo != null && activeNetworkInfo.isConnected();
return result;
Fragment
有一个getContext()
方法。因此,您可以将getLayoutInflater()
替换为getContext()
【讨论】:
以上是关于Fragment 未附加到 FragmentManager的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 Activity 传递到已附加的 Fragment 的方法
Back Stack 未维护 - 如何防止 Fragment 被破坏?
Hilt Fragment 必须附加到@AndroidEntryPoint Activity,同时测试(它附加到@AndEntPoint 标记的活动)
Fragment,RecyclerView:没有附加适配器;跳过布局