Splash Screen für eine App mit Navigation und Fragments ?

  • Antworten:5
Petra Ritter
  • Forum-Beiträge: 81

24.12.2017, 13:57:58 via Website

Schone Festtage allerseits.

Ich bin an der Entwicklung einer App für welche ich das Android Studio die Activity Navigation Dower und das Layout mitttels Fragments erstellt habe.

Die App funktioniert so wie ich mit es vorstelle, der einzige "Schönheitsfehler" ist, wenn man die App aufruft kommt man anscheinend auf eine leeren Bildschirm, weil in der MainActiviti.java nut das leere Framelayout aufgerufen wird.

Meine Frage ist jetzt wie kann ich noch einen zusätzlichen Startbildschirm einfügen, der direkt auf ein Fragment im Projekt verweist, so das der Benutzer nicht erst auf eine leeren Bildschirm kommt.

Die MainActivity.java sieht so aus.

package com.example.petra.accessibilitydemonstration;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity

    implements NavigationView.OnNavigationItemSelectedListener {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    Fragment fragment = null;
    int id = item.getItemId();

    if (id == R.id.nav_welcome) {
        fragment = new WelcomeFragment();
    } else if (id == R.id.nav_table) {
        fragment = new TableFragment();

    } else if (id == R.id.nav_table_accessible) {
        fragment = new TableAccessibleFragment();

    } else if (id == R.id.nav_about_us) {
        fragment = new AboutFragment();

    }

    if (fragment != null){
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();

        ft.replace(R.id.screen_area, fragment);
        ft.commit();
    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

}

Ich werde versuchen, das gesamte Projekt auf GitHup hochzufrieden, damit ihr es anschauen könnt.

Im Internet habe ich Anleitungen gefunden wie man Splash Screen erstellt, da aber die ActivityMain.java wegen des Navigation drower komplizierter ist als normalerweise bin ich nicht sicher an welcher Stelle ich den Code einfügen muss.

Jetzt wünsche ich allen noch einen schönen und besinnlichen Weihnachtstag und ein gutes 2018.

Petra Ritter

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2017, 15:14:19 via App

Hallo Petra,
dir auch schöne Weihnachten.

Du kannst doch in der onCreate schon so tun als würde im Menü was ausgewählt und damit das erste Fragment anzeigen lassen.
z.b.
onNavigationItemSelected(R.id.welcome_fragment);

— geändert am 24.12.2017, 15:19:54

LG Pascal //It's not a bug, it's a feature. :) ;)

Petra Ritter

Antworten
Petra Ritter
  • Forum-Beiträge: 81

24.12.2017, 22:27:32 via Website

Hallo Pascel,

Danke für Deine schelle Antwort.

Leider verstehe ich nicht ganz wie du das meinst.

Habe selber mal was ausprobieren, scheint aber nicht zu funktionieren.

...

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);

    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.screen_area, fragment_welcome);
}

Könntest Du mir bitte auf die Sprünge helfen.

Gruss aus der Schweiz.

Petra

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2017, 22:36:55 via Website

Du hast ein FragmentTranaction#commit() vergessen glaub ich.

z.B: https://stackoverflow.com/a/18940937

— geändert am 24.12.2017, 22:40:26

LG Pascal //It's not a bug, it's a feature. :) ;)

Petra Ritter

Antworten
Petra Ritter
  • Forum-Beiträge: 81

25.12.2017, 17:10:43 via Website

Guten Tag,

Ich bin einen Schritt weiter gekommen.
Habe in der AndroidManifest.xml die Activity, die Strat aufgerufen wird geändert. Diese hat natürlich kein Navigation Drawer.

Ich beabsichtige einen Button in die Activity, die jetzt beim Start aufgerufen wird zu integrieren.

Jetzt stellt sich mir die Frage wie ich das FrameLayout über einen Button aufrufe.

Petra

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

27.12.2017, 16:54:12 via Website

Kleiner Tipp wie man Splash-Screens etwas schöner hinbekommt.

https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154

Der große Vorteil dieser Lösung ist, dass man quasi SOFORT etwas sieht, wenn man die App anklickt, weil der SplashScreen schon im Theme der Activity als Window-Background gerendert wird, noch bevor die Activity hochgefahren und die Views gerendert werden.
So machts auch z.B. die Youtube-App. Da sieht man auch beim Klick sofort das Youtube Logo und erst dann lädt die App an sich.

Wenn man es ganz effizient machen will, kann man auch den Splash-Screen als Background der MainActivity einstellen. Solange die Views der Activity nicht transparent sind, sieht man das Splash Logo dahinter eh nicht. Spart einen Activity Start.

Petra Ritter

Antworten