Probleme mit der Umstellung auf Fragment View in einer App mit OSMdroid

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit der Umstellung auf Fragment View in einer App mit OSMdroid

    Hallo Zusammen,

    ich versuche gerade meine kleine App auf Fragmente umzustellen, damit ich "Settings" entsprechend einbauen kann.
    Jetzt stürzt meine App leider immer beim starten ab und ich vermute einen Fehler in den Layout-Definitionen.

    hier die Dateien
    activity_main.xml

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. <com.google.android.material.appbar.AppBarLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:theme="@style/AppTheme.AppBarOverlay">
    12. <androidx.appcompat.widget.Toolbar
    13. android:id="@+id/toolbar"
    14. android:layout_width="match_parent"
    15. android:layout_height="?attr/actionBarSize"
    16. android:background="?attr/colorPrimary"
    17. app:popupTheme="@style/AppTheme.PopupOverlay" />
    18. </com.google.android.material.appbar.AppBarLayout>
    19. <include layout="@layout/content_main" />
    20. </androidx.constraintlayout.widget.ConstraintLayout>
    Alles anzeigen





    Content_main.xml

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. app:layout_behavior="@string/appbar_scrolling_view_behavior">
    7. <fragment
    8. android:id="@+id/nav_host_fragment"
    9. android:name="androidx.navigation.fragment.NavHostFragment"
    10. android:layout_width="0dp"
    11. android:layout_height="0dp"
    12. app:defaultNavHost="true"
    13. app:layout_constraintBottom_toBottomOf="parent"
    14. app:layout_constraintLeft_toLeftOf="parent"
    15. app:layout_constraintRight_toRightOf="parent"
    16. app:layout_constraintTop_toTopOf="parent"
    17. app:navGraph="@navigation/nav_graph" />
    18. </androidx.constraintlayout.widget.ConstraintLayout>
    Alles anzeigen

    fragment_main.xml

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainFragment">
    8. <LinearLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"
    11. android:orientation="vertical">
    12. <org.osmdroid.views.MapView
    13. android:id="@+id/mapView"
    14. android:layout_width="fill_parent"
    15. android:layout_height="fill_parent"
    16. tilesource="Mapnik" >
    17. </org.osmdroid.views.MapView>
    18. </LinearLayout>
    19. <LinearLayout
    20. android:layout_width="match_parent"
    21. android:layout_height="match_parent"
    22. android:orientation="horizontal">
    23. <ImageButton
    24. android:id="@+id/cmdCenterAuto"
    25. android:layout_width="70dp"
    26. android:layout_height="70dp"
    27. android:src="@drawable/caricon"
    28. android:visibility="visible" />
    29. <ImageButton
    30. android:id="@+id/cmdPerson"
    31. android:layout_width="70dp"
    32. android:layout_height="70dp"
    33. android:src="@drawable/person"
    34. android:visibility="visible" />
    35. <ImageButton
    36. android:id="@+id/cmdOverview"
    37. android:layout_width="70dp"
    38. android:layout_height="70dp"
    39. android:src="@drawable/cardoverview"
    40. android:visibility="visible" />
    41. <ImageButton
    42. android:id="@+id/cmdCarLocation"
    43. android:layout_width="70dp"
    44. android:layout_height="70dp"
    45. android:src="@drawable/ic_menu_mylocation"
    46. android:visibility="visible" />
    47. <ImageButton
    48. android:id="@+id/cmdSettings"
    49. android:layout_width="70dp"
    50. android:layout_height="70dp"
    51. android:src="@drawable/ic_menu_offline"
    52. android:visibility="visible" />
    53. </LinearLayout>
    54. </androidx.constraintlayout.widget.ConstraintLayout>
    Alles anzeigen

    MainActivity

    Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. Toolbar toolbar = findViewById(R.id.toolbar);
    7. setSupportActionBar(toolbar);
    8. }
    9. @Override
    10. public boolean onCreateOptionsMenu(Menu menu) {
    11. // Inflate the menu; this adds items to the action bar if it is present.
    12. getMenuInflater().inflate(R.menu.menu_main, menu);
    13. return true;
    14. }
    15. @Override
    16. public boolean onOptionsItemSelected(MenuItem item) {
    17. // Handle action bar item clicks here. The action bar will
    18. // automatically handle clicks on the Home/Up button, so long
    19. // as you specify a parent activity in AndroidManifest.xml.
    20. int id = item.getItemId();
    21. //noinspection SimplifiableIfStatement
    22. if (id == R.id.action_settings) {
    23. return true;
    24. }
    25. return super.onOptionsItemSelected(item);
    26. }
    27. }
    Alles anzeigen
    Vielleicht sieht ja jemand von Euch mein Problem oder gibt es eine gute Webseite, wo man das ganze vernünftig nachvollziehen
    kann. Ich habe mir letztendlich am Ende eine Beispiel-App mit dem Android Studio angelegt und danach meine Applikation
    versucht umzubauen.

    Ich vermute den Layoutfehler, weil ich im Editor die Warnmeldung bekomme:

    Quellcode

    1. This view is not contained vertical: at runtime it will jump to the top unless you add a vertical constraint



    Viele Grüße
    R.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ritchie ()

  • Hallo Jogimuc,

    stimmt. Habe ich abgeändert. Leider ohne erfolgt.
    Im Prinzip habe ich die Dateien aus dem Beispielprogramm übernommen.

    Ich habe jetzt auch mal einfach das komplette fragment_main und die java class durch das Beispiel aus der laufenden Beispielanwendung übernommen.
    Es stürzt immer noch ab. :(


    Quellcode

    1. protected void onCreate(Bundle savedInstanceState) {
    2. super.onCreate(savedInstanceState);
    3. setContentView(R.layout.activity_main);
    4. Toolbar toolbar = findViewById(R.id.toolbar);
    5. setSupportActionBar(toolbar);
    6. }

    Diese Routine wird noch fehlerfrei durchlaufen.

    Quellcode

    1. Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
    Daher habe ich diese beiden Zeilen entfernt:

    Quellcode

    1. // Toolbar toolbar = findViewById(R.id.toolbar);
    2. // setSupportActionBar(toolbar);
    in der Main Activity. Das kleine Beispielprogramm lief dann.

    Ich scheine aber ein Problem mit der Permission Request zu haben, da das Programm jetzt an dieser Stelle sich beendet.

    So sieht die Routine jetzt innerhalb eines Fragments aus:

    Quellcode

    1. if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
    2. ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    3. // Permission is not granted
    4. // Should we show an explanation?
    5. if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
    6. Manifest.permission.ACCESS_FINE_LOCATION)) {
    7. // Show an explanation to the user *asynchronously* -- don't block
    8. // this thread waiting for the user's response! After the user
    9. // sees the explanation, try again to request the permission.
    10. } else {
    11. // No explanation needed; request the permission
    12. ActivityCompat.requestPermissions(getActivity(),
    13. new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
    14. MY_PERMISSIONS_REQUEST_GPS_STATE);
    15. }
    16. }
    Alles anzeigen

    Viele Grüße
    R.
  • Scheinen doch noch andere Probleme im Zusammenhang mit dem Layout zu sein.

    Quellcode

    1. Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener"

    Quellcode

    1. mapView = getView().findViewById(R.id.mapView); // Find the Map view in the resource file
    2. mapView.setTileSource(TileSourceFactory.MAPNIK);
    3. mapView.setMultiTouchControls(true);

    Ich bekomme für "mapView" einen Null-Pointer zurück. Daher "knallt" es.

    Vielen Dank für den Tip mit dem Layout. Das hat mich wieder in die Situation gebracht, den Debugger zu verwenden.
    Viele Grüße
    R.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ritchie ()

  • ActivityCompat.checkSelfPermission

    Ist auch falsch im Fragment du brauchst den Context der Activity und nicht die Klasse ActivityCompat. Ich meine die Instanz der activity. Das was dir due IDE vorschlägt und berichtigt ist falsch in diesem Fall.

    getActivity().checkSelfPermission

    Sollte gehen, beim Suchen mit findviewbyId ist es übrigens das selbe.

    Ein Methoden Aufruf ohne die Instanz geht nicht.

    Dein Fragment erbt nicht von Activity also ist die Methode nicht vorhanden und du brauchst den Context. Eine Variante den zubekommen weist du jetzt.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • getView() ist auch falsch.
    Sagte ich bereits.
    Dafür kannst du dir die view in der onCreateView sichen die du dort inflates.

    Auch eine möglich an den Context zukommen ist die onAttach Methode dort wird der dir als Parameter übergeben. Kannst ihn in einer Klassen Variablen speichern.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Hallo Jogimuc,

    danke für die Tipps. Die Anwendung startet jetzt wieder. Ich habe die Permission auch in die MainActivity gesetzt.
    Musste aber jetzt "@SuppressLint("MissingPermission")" in das Fragment einfügen. Ist das normal ?

    Ansonsten startet die App wieder und zeigt auch wieder Daten auf dem Bildschirm an.

    Derzeit stört mich nur noch, das ich plötzlich eine zweiten Bereich der Actionbar habe, den ich nicht verwende.
    Hier wird derzeit ein "grauer" Balken angezeigt. Mal sehen ob ich das auch noch finde.


    Gefunden, das hier war wohl durch das ganze Probieren zu viel in der Datei "activity_main.xml"

    Quellcode

    1. <com.google.android.material.appbar.AppBarLayout
    2. android:layout_width="match_parent"
    3. android:layout_height="wrap_content"
    4. android:theme="@style/AppTheme.AppBarOverlay">
    5. <androidx.appcompat.widget.Toolbar
    6. android:id="@+id/toolbar"
    7. android:layout_width="match_parent"
    8. android:layout_height="?attr/actionBarSize"
    9. android:background="?attr/colorPrimary"
    10. app:popupTheme="@style/AppTheme.PopupOverlay" />
    11. </com.google.android.material.appbar.AppBarLayout>
    Alles anzeigen





    Viele Grüße
    R.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ritchie ()

  • XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainFragment">
    8. <LinearLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"
    11. android:orientation="vertical">
    12. <org.osmdroid.views.MapView
    13. android:id="@+id/mapView"
    14. android:layout_width="fill_parent"
    15. android:layout_height="fill_parent"
    16. tilesource="Mapnik">
    17. </org.osmdroid.views.MapView>
    18. </LinearLayout>
    19. <LinearLayout
    20. android:layout_width="match_parent"
    21. android:layout_height="match_parent"
    22. android:orientation="horizontal">
    23. <ImageButton
    24. android:id="@+id/cmdCenterAuto"
    25. android:layout_width="70dp"
    26. android:layout_height="70dp"
    27. android:src="@drawable/caricon"
    28. android:visibility="visible" />
    29. <ImageButton
    30. android:id="@+id/cmdPerson"
    31. android:layout_width="70dp"
    32. android:layout_height="70dp"
    33. android:src="@drawable/person"
    34. android:visibility="visible" />
    35. <ImageButton
    36. android:id="@+id/cmdOverview"
    37. android:layout_width="70dp"
    38. android:layout_height="70dp"
    39. android:src="@drawable/cardoverview"
    40. android:visibility="visible" />
    41. <ImageButton
    42. android:id="@+id/cmdCarLocation"
    43. android:layout_width="70dp"
    44. android:layout_height="70dp"
    45. android:src="@drawable/ic_menu_mylocation"
    46. android:visibility="visible" />
    47. </LinearLayout>
    48. </androidx.constraintlayout.widget.ConstraintLayout>
    Alles anzeigen
    diese Zeilen waren/sind in der Layout Datei der "activity_main.xml"

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. <com.google.android.material.appbar.AppBarLayout
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:theme="@style/AppTheme.AppBarOverlay">
    12. <androidx.appcompat.widget.Toolbar
    13. android:id="@+id/toolbar"
    14. android:layout_width="match_parent"
    15. android:layout_height="?attr/actionBarSize"
    16. android:background="?attr/colorPrimary"
    17. app:popupTheme="@style/AppTheme.PopupOverlay" />
    18. </com.google.android.material.appbar.AppBarLayout>
    19. <include layout="@layout/content_main" />
    20. </androidx.coordinatorlayout.widget.CoordinatorLayout>
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ritchie ()

  • Hallo,

    hier die Zeilen in der MainActivity, welche ich remarkt habe

    Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. private static final int MY_PERMISSIONS_REQUEST_GPS_STATE = 1;
    3. private static final int MY_PERMISSIONS_REQUEST_WRITE_SDCARD = 2;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. // Toolbar toolbar = findViewById(R.id.toolbar);
    9. // setSupportActionBar(toolbar);
    Alles anzeigen