Android - как использовать фрагмент карты в архитектуре навигации - PullRequest
0 голосов
/ 20 июня 2020

В своем приложении я достиг точки, когда я обнаружил, что делюсь данными между Activity неуклюжим способом - поэтому я решил попробовать переключить большую часть приложения на одно Activity (чтобы использовать одну ViewModel на экранах) , используя компоненты навигации для обмена фрагментами вместо изменения действий.

Кажется, что для каждого пункта назначения мне нужен файл макета xml и класс фрагмента, который выглядит следующим образом:

class DestinationFragment: Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_destination_layout, container, false)

        return view
    }
}

(На самом деле я использую Java, но смог найти только Kotlin примеров.) источник

Однако я не уверен, что делать с экраном «Карты». В настоящее время у меня есть его собственная активность:

activity_maps. xml

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity">

<!--    Toolbar stuff     -->

<FrameLayout android:id="@+id/container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/my_toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity" />
</FrameLayout>
</RelativeLayout>

MapsActivity. java

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleMap.OnInfoWindowClickListener {

    private GoogleMap mMap;

    //Create the activity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                 .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        //Check if user has location permissions granted
        if (!locationPermissionCheck()) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
        } else {
            setupMap(); //custom function defined elsewhere
        }
    }

Итак, мой вопрос - если в настоящее время у меня есть Activity, которое извлекает фрагмент карты, чтобы вписаться в архитектуру навигации, мне теперь нужен фрагмент, который извлекает фрагмент карты? то есть что-то вроде ...

public class MapDestinationFragment extends Fragment implements OnMapReadyCallback, GoogleMap.OnInfoWindowClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.article_view, container, false);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
             .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}


@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    //Check if user has location permissions granted
    if (!locationPermissionCheck()) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
    } else {
        setupMap(); //custom function defined elsewhere
    }

}

Если это решение, можно ли иметь фрагмент внутри фрагмента? Или мне лучше оставить это отдельное действие и просто принять проблему совместного использования данных?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...