Beiträge von Pommes9485
-
-
Wenn ich mich normal in der App bewege funktioniert alles. Es tritt wirklich nur dann auf, wenn ich von einem Fragment zu einem anderen wechseln will.
-
Guten Tag,
ich sitze jetzt schon seit mehreren Tagen an diesem Problem und denke, dass ich da irgendwo einen grundlegenden Verständnis Fehler habe. Folgendes Szenario:
Ich habe eine Activity, mit 3 Fragments, welche durch einen FragmentStatePagerAdapter verwaltet werden. Wenn ich in Fragment 3 auf ein Item in der Liste klicke, wird eine Methode der Activity aufgerufen, welche zu Fragment 2 wechselt und dort einen Dialog öffnet, welcher dann abschließend ein erstelltes Objekt in Fragment 2 anzeigt.
Mein Problem ist nun, dass getContext(), getActivity(), getView() alle null wiedergeben, obwohl ich ja eigentlich schon auf dem Fragment sein müsste.
Auch das Speichern der Activity bzw. des Contextes in onAttach bzw. onCreateView ist dann null. Wenn ich die Methode direkt aus dem Fragment aufrufe, funktioniert alles.Nun folgt der Code, ich habe probiert, es so zu vereinfachen wie möglich, aber das Projekt ist schon relativ umfangreich.
MainActivity:
Java
Alles anzeigenpublic void openDialog(int fragment, String data) { mViewPager.setCurrentItem(fragment); // Wechsel zum betroffenen Fragment switch(fragment) { case AKTUELLE_BESTELLEUNG: ((AktuelleBestellungFragment)mSectionsPagerAdapter.getItem(AKTUELLE_BESTELLEUNG)).openNewBestellungDialog( this, Integer.parseInt(data)); // öffne den Dialog, this ist die Acitivity, obwohl das nur ein Versuch ist, da getActivity() null ist im Fragment } } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch(position) { case 0: return AlleBestellungenFragment.createInstance(); case 1: return AktuelleBestellungFragment.createInstance(); case 2: return ArtikelUebersichtFragment.createInstance(); default: return null; } } @Override public int getCount() { return 3; } }
AktuelleBestellungFragment, das Fragment, welches den Dialog enthält:
Java
Alles anzeigenpublic static AktuelleBestellungFragment createInstance() { AktuelleBestellungFragment f = new AktuelleBestellungFragment(); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_aktuelle_bestellungen, container, false); this.v = v; Log.i("onCreate", "called"); setHasOptionsMenu(true); initializeView(v); return v; } public void openNewBestellungDialog(final Activity c, int id) { // hier sind die Methoden getActivity()/getView()/getContext() null //während c hier für die meisten Sachen reicht, kann ich nicht auf den View des Fragments zugreifen, was ich aber muss, ob dieses neu zu laden. }
Wenn in Fragment 3 auf ein Item geklickt wird, passiert folgendes:
Code((MainActivity)getActivity()).openDialog(MainActivity.AKTUELLE_BESTELLEUNG,artikel_lieferant[position].getId()+"" );
Ich hoffe, ich habe mich verständlich ausgedrückt.
Wie sollte man so etwas angehen? Bzw. warum sind die Abfragen überhaupt null, wenn doch in getItem eine neue Instanz erstellt wird, falls diese nicht mehr vorhanden ist?
Vielen Dank schon mal für die Hilfe, ich stecke hier echt fest
-
Zitat
Also um es nicht falsch zu verstehen, zum Anzeigen lassen benutz ich immer String.valueOf, egal ob es ein Double, Integer oder Float ist?
Im Prinzip schon, ja.
Wenn du einen String hat, der eine Zahl repräsentierst und du damit wieder rechnen möchtest, dann brauchst du einen Integer. Und dafür könntest du dann schreiben:
JavaString meine_zahl_als_string = "33"; int meine_zahl_als_int = Integer.valueOf(meine_zahl_als_string);
Allerdings gibt es noch einen Unterschied zwischen "Integer" und "int". Das würde jetzt aber den Rahmen sprengen. In den meisten Fällen würdest du vermutlich Integer.parseInt(String) benutzen
-
Integer.valueOf gibt dir einen Integer wieder und String.valueOf gibt dir einen String wieder. Integer sind nur Zahlen, String sind Zahlen und Buchstaben und co. Da du hier Text anzeigen möchtest, ist String.valueOf nötig, oder eben " "" + zahlen1".
Das liegt daran, dass du ja noch nichts machst, wenn die Zahl doppelt ist. Es wird überprüft, dafür ist die if-Abfrage drinne. Aber nichts darauf hin dagegen getan. Ich denke eine neue Zahl für die doppelte zu wählen ist am sinnvollsten. Ich würde das ganze aber, ähnlich wie Champs noch in extra Methoden auslagern. Dann kannst du das überprüfen danach direkt noch mal machen, ohne dafür doppelten Code zu haben.
-
Oh, das ist mein Fehler. Mach aus dem <= in den Schleifen ein <, dann sollte es gehen.
-
Dann würde ich mir den Logcat Bericht einmal anschauen, das ist sehr wichtig, auch wenn dieser Fehler relativ einfach ist.
TextView.setText() nimmt verschiedene Argumente. Das einfachste ist ein String, dieser wird dann direkt angezeigt. Ansonsten geht auch ein int-Wert, welcher meistens eine Referenz auf einen String ist. Zum Beispiel "R.string.teststring". Das wäre dann aber extra in der xml Datei festgelegt.
Integer.valueOf() gibt dir den Integer Wert des Parameters wieder. Das möchtest du aber nicht. Also am Besten einfach
benutzen.
-
Das funktioniert fast. Zwar muss ich die Tastatur jetzt 2mal schließen (1mal Pfeil nach unten, dann quasi erst zurück), aber immerhin verschwindet die Leiste so.
Allerdings ist das gleiche Problem noch bei Dialogen. Ich habe schon einen Dismiss Listener eingebaut, aber irgendetwas läuft da noch nicht.
Gibt es denn keine saubere Lösung? Das erscheint mir irgendwie nicht so gewolltEDIT:
So, das klappt nun auch. Ich musste die das erneute setzen der Flags ein wenig verzögern. Allerdings ist irgendwas noch nicht ganz richtig. Wenn ich jetzt die Navigation Bar zeigen will (zum Beispiel durch das Wischen von unten nach oben am unteren Rand), erscheint die Bar komplett Schwarz und verschwindet auch nicht wieder. -
Ich würde es in einer Array machen, dann kannst du durch die einzelnen Zahlen in einer Schleife durchgehen und dabei jede Zahl mit jeder anderen vergleichen. Am Einfachsten wäre wohl etwas ähnliches wie dieses hier:
Javaint[] zahlen = new int[7]; //...zahlen reinschreiben, am besten auch direkt in einer Schleife //Abfrage ob gleiche vorkommen for(int i=0; i<=zahlen.length; i++) { for(int a=i+1; a<=zahlen.length;a++) if(zahlen[i]==zahlen[a]) //zahlen[i] bzw. zahlen[a] sind gleich }
Zur Erklärung:
Die erste Schleife geht einfach nur die Zahlen nacheinander durch. Für jede Zahl wird aber eine weitere Schleife gestartet. Diese startet nicht bei 0, sondern bei i+1, daher werden bereits verglichene Zahlen nicht noch einmal verglichen und die Zahl wird nicht mit sich selber verglichen. Sollte so stimmen -
Hallo,
ich entwickle eine App, welche hinterher nur auf Tablets genutzt wird und auch quasi nur benutzt wird, für einen anderen Zweck ist das Tablet nicht da. Durch Android 5 und dem Device Owner habe ich diesen Effekt auch schon erzielt.
Jetzt habe ich jedoch noch folgendes Problem. Normalerweise sieht man nur die App, keine Navigation/Notification Bar. Wenn ich in ein EditText klicke, erscheint die Tastatur mit der Navigation Bar. Bisher hier hin kein Problem, stört ja nicht. Wenn ich jedoch die Tastatur schließe (über den Zurück Pfeil in der Bar), bleibt die Navigation Bar erhalten und ist auch nicht mehr Transparent. Erst nach beenden der Activity und erneuten öffnen dieser, verschwindet die Bar wieder. Woran kann das liegen?Bisher benutze ich 2 Methoden, um den Fullscreen Mode zu erreichen, in beiden Activitys jeweils in onResume und in onCreate:
Java
Alles anzeigenpublic void UiChangeListener() { final View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } } }); } private void goFullScreen() { int uiOptions = getWindow().getDecorView().getSystemUiVisibility(); int newUiOptions = uiOptions; // Navigation bar hiding: Backwards compatible to ICS. if (Build.VERSION.SDK_INT >= 14) { newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } // Status bar hiding: Backwards compatible to Jellybean if (Build.VERSION.SDK_INT >= 16) { newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; } // Immersive mode: Backward compatible to KitKat. // Note that this flag doesn't do anything by itself, it only augments the behavior // of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample // all three flags are being toggled together. // Note that there are two immersive mode UI flags, one of which is referred to as "sticky". // Sticky immersive mode differs in that it makes the navigation and status bars // semi-transparent, and the UI flag does not get cleared when the user interacts with // the screen. if (Build.VERSION.SDK_INT >= 18) { newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } getWindow().getDecorView().setSystemUiVisibility(newUiOptions); }
Vermutlich ergänzen sich die beiden Methoden, aber das ist die Lösung, die ich mir zusammengesucht habe, leider erzielt sie aber immer noch nicht DEN Erfolg.
Das Testgerät läuft mit Android 5.1.1. . -
Guten Tag,
ich habe hier ein 14 Zoll Tablet mit einer Auflösung von 1920*1080 stehen, für das ich unter anderem eine Gallerie erstellen möchte. Dabei habe ich bereits die ViewPager und das FragmentStatePagerAdapter für mich entdeckt. Allerdings stehe ich noch vor dem Problem, dass die Bilder beim Swipen etwas laggen. Es sieht einfach nicht smooth aus. In der Gallery App des Tablets funktioniert das aber, daher müsste es ja für mich auch machbar sein. Ich habe schon einige Performance Optimierungen mitgemacht, welche aber nicht viel geholfen haben (wenn überhaupt). Hier also der Code:
Der View pro Seite:
Java
Alles anzeigenpackage com.mb.app.pfarrer.fotos; import android.app.Fragment; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ImageView; import com.mb.app.pfarrer.R; import java.io.File; public class FotoViewFragment extends Fragment { View rootView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.imagesliderview, container, false); ((ImageView) rootView.findViewById(R.id.imageView8)).setImageBitmap(decodeSampledBitmap(1920 / 2, 1080 / 2, getArguments().getString("fotopath"))); this.rootView = rootView; return rootView; } public static Bitmap decodeSampledBitmap(int reqWidth, int reqHeight, String path) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, options); } public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 2; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } @Override public void onDestroy() { super.onDestroy(); ((ImageView) rootView.findViewById(R.id.imageView8)).setImageBitmap(null); Log.i("Fragment", "zerstört"); } }
Das Layout mit dem Pager:Java
Alles anzeigenpackage com.mb.app.pfarrer.fotos; import android.app.Fragment; import android.app.FragmentManager; import android.os.Bundle; import android.support.v13.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.mb.app.pfarrer.FileManager; import com.mb.app.pfarrer.R; import java.io.File; /** * Created by mberg on 03.11.2015. */ public class FotoPagerFragment extends Fragment implements View.OnClickListener { File fotos[]; ScreenSlidePagerAdapter mAdapter; ViewPager mPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fotoviewfragment, container, false); fotos = FileManager.getFotos(getArguments().getString("albumname")); Log.i("Length", fotos.length+""); mAdapter = new ScreenSlidePagerAdapter(this.getActivity().getFragmentManager()); mPager = (ViewPager)rootView.findViewById(R.id.pager); mPager.setAdapter(mAdapter); //mPager.setOffscreenPageLimit(fotos.length); rootView.findViewById(R.id.foreward).setOnClickListener(this); rootView.findViewById(R.id.backward).setOnClickListener(this); return rootView; } @Override public void onClick(View v) { if(v.getId()==R.id.foreward) { mPager.setCurrentItem(mPager.getCurrentItem()+1); } else { mPager.setCurrentItem(mPager.getCurrentItem()-1); } } private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { FotoViewFragment fvf; public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Bundle b = new Bundle(); b.putString("fotopath", fotos[position].getAbsolutePath()); fvf = new FotoViewFragment(); fvf.setArguments(b); return fvf; } @Override public int getCount() { return fotos.length; } } }
Ich habe auch den inSampleSize Wert schon mal vergrößert (bis 16), was aber von Swipen her keinen Unterschied gemacht hat.
Habt ihr noch Ideen? Ist da ein totaler Performance Killer drinne?`
Hardware Acceleration ist bereits eingeschaltet. -
Guten Tag,
ich entwickle momentan ein App welche als einzige App laufen soll, das Tablet steht dann hinterher wo fest eingebaut.
Der Ausschalter ist nicht erreichbar, das OS ist 4.4.2 Android Vanilla rooted.
Bisher habe ich bereits folgendes herausgefunden:
Kiosk Modus soll den Homescreen ersetzen. Vollbildmodus um die Navbar und die Benachrichtigungsleiste auszublenden.
Aber die Einstellungen können immer noch erreicht werden, indem von oben nach unten geswipt wird und dann über die Quicksettings Einstellungen aufgerufen werden.
Außerdem möchte ich die Tastatur benutzen, aber auch über diese können die Eingabeeinstellungen geöffnet werden.Gibt es ein Gesamtpacket, um das ganze erreichen, oder muss ich an jeder Baustelle einzeln ansetzen?
Ich werde doch nicht der Erste sein, der das machen möchte, oder? -
Also:
Es geht nur um zu Fuß und es soll ein Livetracking stattfinden.
Deswegen alle X Sekunden (10 war nur ein Beispiel) und deswegen direkt hochladen -
Die Tatsache, dass der Service nur dann gestartet wird, wenn ein Update benötigt wird und danach wieder beendet wird. Aber anscheinend reichen 10 Sekunden Abstand nicht aus, um GPS abzuschalten, einmal gefunden hält es unabhängig vom Service den Dienst aufrecht.
Ich denke dann hat sich die Frage erledigt.
-
Guten Tag,
ich starte alle 10 Sekunden einen Service, welcher dann die Position holt und hochlädt.
Momemtan mache ich es nur über den Network_Provider, allerdings würde ich auch gerne die Alternative über GPS bieten. Das Problem ist jetzt, dass wenn ich GPS updates ohne regelmäßige Updates mache (also ohne requestLocationUpdates), dass GPS dann jedesmal wieder neu gesucht werden muss, oder?
Kann ich das irgendwie umgehen?
Den Service dauerhaft laufen zu lassen ist nicht mein Ziel, wäre also über Möglichkeiten sehr glücklich. -
Weil ich sicher stellen muss, dass diese Updates immer weiter laufen, egal ob die App beendet wird oder nicht, und dies schien mir der einfachste Weg dafür zu sein.
Und überall wird geschrieben, man sollte anstatt einen länger Laufenden Service zu erstellen, lieber viele kleine machen, welche laufen und dann fertig sind...:DHabe SQLite jetzt implementiert, teste es gleich mal...
-
Weil ich den Service jetzt per AlarmManager alle 10 Sekunden starte und nur für den Kurzen Prozess behalte. Deswegen würden sie da auch nicht lange gesichert sein.
SQLite hatte ich schon befürchtet, wird es wohl drauf hinauslaufen..^^
-
Guten Tag,
ich hoffe ja auf eine möglichst einfache Antwort^^
Habe folgendes Szenario:
Mit einem Service wird alle X Minuten um eine Bestätigung gebeten. Alle X+1 Minuten schaue ich dann, ob diese hinterlegt wurde.
Anderes Szenario:
Der Service ruft GPS Daten ab und lädt diese hoch. Nun sollen diese Daten aber auch in der App dargestellt werden. Wenn diese läuft ist es kein Problem, dann übergebe ich die Daten einfach per Binder. Aber wenn der Service läuft, die App beendet wird und dann 10 Minuten später die App geöffnet wird, sollen diese Daten auch angezeigt werden.Der einzige Weg, welcher mir jetzt einfallen würde, wäre, dass ganze in eine Datei zu speichern und dann beim Aufrufen wieder zu lesen.
Oder kann ich das ganze auch in eine Statische Klasse speichern?
Was passiert mit dieser, wenn die App beendet wird? -
Danke sehr!
Allerdings habe ich damit immernoch das Problem, dass wenn ich die App über die Zurück-Taste beende, beim erneuten Aufrufen, erneut der Async Task nicht läuft.
-
Guten Tag,
ich bin mir ziemlich sicher, ich übersehe hier gerade etwas, weiß allerdings nicht, was genau.
Ich benutze eine von AsyncTask erbende Klasse um die einen Counter anzuzeigen, welcher sich alle 500ms aktualisiert.
Das läuft auch, wenn ich jedoch die App minimiere und dann aus den Tasks neustarte, steht dort wieder der Standart Text und der AsyncTask scheint nicht mehr zu laufen. Auch einin der überschriebenen onResume Methode hilft hier nicht.
Habt ihr eine Ahnung, warum nicht?
Java
Alles anzeigenpackage com.mb.Happy; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import java.util.GregorianCalendar; public class MainActivity extends Activity { boolean run = true; GregorianCalendar gc = new GregorianCalendar(); showCounter e ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gc.set(GregorianCalendar.DAY_OF_MONTH, 21); gc.set(GregorianCalendar.HOUR_OF_DAY, 12); gc.set(GregorianCalendar.MINUTE, 0); gc.set(GregorianCalendar.SECOND, 0); gc.set(GregorianCalendar.MONTH, GregorianCalendar.NOVEMBER); setContentView(R.layout.activity_main); ((ImageView)findViewById(R.id.imageView)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String url = "http://www.amazon.de/Dauernd-Limitierte-Special-Edition-inklusive/dp/B00NFS6PRG/ref=sr_1_1?ie=UTF8&qid=1415221765&sr=8-1&keywords=herbert+gr%C3%B6nemeyer"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); } }); e = new showCounter(); } @Override protected void onResume() { super.onResume(); run = false; e = null; e = new showCounter(); e.execute(""); } @Override protected void onStart() { super.onResume(); run = false; e = null; e = new showCounter(); e.execute(""); } @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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private class showCounter extends AsyncTask<Object, String, String>{ @Override protected String doInBackground(Object... params) { long last = 0; Log.i("AsyncTask", "Run"); run = true; while(run) { if(System.currentTimeMillis()-last >500){ long difference = gc.getTimeInMillis() - System.currentTimeMillis(); GregorianCalendar c = new GregorianCalendar(); c.setTimeInMillis(difference); String[] s = new String[]{formatNice(c.get(GregorianCalendar.DAY_OF_MONTH)) ,formatNice(c.get(GregorianCalendar.HOUR_OF_DAY)) ,formatNice(c.get(GregorianCalendar.MINUTE)) ,formatNice(c.get(GregorianCalendar.SECOND))}; publishProgress(s); last = System.currentTimeMillis(); } } return null; } @Override protected void onProgressUpdate(String... s) { ((TextView)findViewById(R.id.tagZahl)).setText(s[0]); ((TextView)findViewById(R.id.stundeZahl)).setText(s[1]); ((TextView)findViewById(R.id.minutenZahl)).setText(s[2]); ((TextView)findViewById(R.id.sekundenZahl)).setText(s[3]); } } public String formatNice(int i) { if(i<10 && i>-10) return "0"+i; return ""+i; } }