2014-10-27 2 views
2

У меня есть DialogFragment показано, как диалог с использованием dialogFragment.show(this);MapView в диалоге

представления содержимого этого фрагмента является ScrollView с MapView в нижней части. onInterceptTouchEvent позаботился о ScrollView из-за наличия MapView. И он отлично работает при использовании в качестве обычного фрагмента. Но в качестве диалога это происходит во время прокрутки.

enter image description here

enter image description here

MapView выходит из Dialog.

EDIT:

Это не сработало:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="160dp" 
    android:layout_below="@id/view_text" > 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/view_map" 
     android:layout_width="match_parent" 
     android:layout_height="160dp" 
     map:uiRotateGestures="true" 
     map:uiScrollGestures="true" 
     map:uiTiltGestures="false" 
     map:uiZoomControls="false" 
     map:uiZoomGestures="true" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="160dp" /> 
</RelativeLayout> 
+0

означает, что вам нужно? эта карта должна быть в диалоге? –

+0

@AndoMasahashi Это отображение карты не должно выходить из диалогового окна при прокрутке вверх. Он должен быть скрыт точно так же, как и последняя строка текста, когда прокручивается из диалогового окна. Точно так же, как в типичном прокрутке. –

+0

Могу ли я предоставить образец кода для работы над ним>? –

ответ

1

Ну Эти шаги, я использовал, чтобы следовать, когда я должен положить карту в диалоговом или фрагмент (или вид пейджера).

Предпосылки: Уже есть библиотека игровых сервисов, добавлено разрешение, такое как INTERNET, WRITE_EXTERNAL_STORAGE и метаданные картографических ключей и игровых сервисов.

Шаг 1: Создание прозрачного класса карты для использования карт Этого класса будет добавлять карты в прозрачной макете кадра для удаления по умолчанию черного слоя (появляется в некоторых устройствах).

public class TransparentMapFragment extends MapFragment { 

    public TransparentMapFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup view, 
      Bundle savedInstance) { 
     View layout = super.onCreateView(inflater, view, savedInstance); 

     FrameLayout frameLayout = new FrameLayout(getActivity()); 
     frameLayout.setBackgroundColor(getResources().getColor(
       android.R.color.transparent)); 
     ((ViewGroup) layout).addView(frameLayout, new ViewGroup.LayoutParams(
       LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     return layout; 
    } 

    public static TransparentMapFragment newInstance(String abc) { 
     TransparentMapFragment tsf = new TransparentMapFragment(); 
     return tsf; 
    } 
} 

Шаг 2: Для стиля изменения Диалог Фрагмент диалогового фрагмента

<style name="Theme.Default.Dialog" parent="@android:style/Theme.Dialog"></style> 

    <style name="Theme.CustomDialog" parent="Theme.Default.Dialog"> 
     <item name="android:windowIsTranslucent">true</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:colorBackgroundCacheHint">@null</item> 
    </style> 

Шаг 3: Схема Диалог Создан полный диалог экрана и добавил обивка в соответствии с вашими потребностями. Здесь я использую 60dip

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="60dip" > 

    <ScrollView [Use your lockable scroll view] 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#fff" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="8dip" 
       android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." 
       android:textColor="#000" 
       android:textSize="12sp" /> 


      <fragment 
       android:id="@+id/map" 
       android:name="com.app.widgets.TransparentMapFragment [Path of Transparent Map]" 
       android:layout_width="match_parent" 
       android:layout_height="100dip" /> 
     </LinearLayout> 
    </ScrollView> 


</FrameLayout> 

Шаг 4: Диалог настройки класс фрагментировать Нормальная Реализация Карта

public class MapDialogFragment extends DialogFragment { 

    private View view; 

    private GoogleMap mMap; 
    private double lat; 
    private double lon; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Dialog dialog = new Dialog(getActivity(), 
       R.style.Theme_CustomDialog); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     view = inflater.inflate(R.layout.dialog_map, null); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setContentView(view); 
     // Creating Full Screen 
     dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT); 

     return dialog; 
    } 

    @Override 
    public void onActivityCreated(Bundle bundle) { 
     super.onActivityCreated(bundle); 

     initializeViews(); 

    } 

    private void initializeViews() { 

     setUpMapIfNeeded(); 
    } 

    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the 
     // map. 

     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((TransparentMapFragment) getActivity().getFragmentManager() 
        .findFragmentById(R.id.map)).getMap(); 
      mMap.getUiSettings().setZoomControlsEnabled(false); 

      if (isGoogleMapsInstalled()) { 
       if (mMap != null) { 
        setUpMap(); 
       } 
      } else { 
       Builder builder = new AlertDialog.Builder(getActivity()); 
       builder.setMessage("installGoogleMaps"); 
       builder.setCancelable(false); 
       builder.setPositiveButton("install", getGoogleMapsListener()); 
       AlertDialog dialog = builder.create(); 
       dialog.show(); 
      } 
     } 
    } 

    private void setUpMap() { 

     lat = 28.6100; 
     lon = 77.2300; 

     final LatLng position = new LatLng(lon, lat); 
     mMap.clear(); 
     mMap.getUiSettings().setAllGesturesEnabled(false); 
     mMap.addMarker(new MarkerOptions().position(position).snippet("")); 
    } 

    public boolean isGoogleMapsInstalled() { 
     try { 
      getActivity().getPackageManager().getApplicationInfo(
        "com.google.android.apps.maps", 0); 
      return true; 
     } catch (PackageManager.NameNotFoundException e) { 
      return false; 
     } 
    } 

    public android.content.DialogInterface.OnClickListener getGoogleMapsListener() { 
     return new android.content.DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(
         Intent.ACTION_VIEW, 
         Uri.parse("market://details?id=com.google.android.apps.maps")); 
       startActivity(intent); 

       // Finish the fragment so they can't circumvent the check 
       if (getActivity() != null) { 
        Fragment fragment = (getActivity().getFragmentManager() 
          .findFragmentByTag(MapFragment.class.getName())); 
        FragmentTransaction ft = getActivity().getFragmentManager() 
          .beginTransaction(); 
        ft.remove(fragment); 
        ft.commitAllowingStateLoss(); 
       } 
      } 

     }; 
    } 

    @Override 
    public void onDestroyView() { 

     super.onDestroyView(); 
     if (getActivity() != null) { 
      try { 
       Fragment fragment = (getActivity().getFragmentManager() 
         .findFragmentById(R.id.map)); 
       FragmentTransaction ft = getActivity().getFragmentManager() 
         .beginTransaction(); 
       ft.remove(fragment); 
       ft.commitAllowingStateLoss(); 
      } catch (Exception e) { 

      } 
     } 

    } 

} 

Результат:

result 1

result 2

result 3

Надеюсь, что это поможет. :)

+1

Отличный ответ. Спасибо – Ravi

+0

Отличный пример, одна исправление, хотя последняя позиция LatLng = новый LatLng (lon, lat); должно быть окончательным LatLng position = new LatLng (lat, lon); – prasunnair

1

Это хорошо известная проблема. Попробуйте обернуть MapView этой структурой (original post here).

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="160dp" 
    > 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/view_map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     map:uiRotateGestures="true" 
     map:uiScrollGestures="true" 
     map:uiTiltGestures="false" 
     map:uiZoomControls="false" 
     map:uiZoomGestures="true" 
     /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</FrameLayout> 
+0

Да, я видел этот ответ, но это не решило мою проблему. Я отредактировал свой вопрос с помощью используемого вами решения, которое не сработало. –

Смежные вопросы