Häufig gestellte Fragen zur Android-Programmierung von Anfänger zu Anfänger

Vorwort zu den FAQ.

Programmieren war lange Zeit mein Hobby (wenn auch in anderen Sprachen und Plattformen), aber meine Hände erreichten vor kurzem den Android. Es dauerte einige Schritte, bis ich Programme schrieb.
Zuerst gab es ein paar Monate, die Java gewidmet waren, auf der Seite mit dem "Flexor".
Nach langen Versuchen, sich mit Eclipse anzufreunden, endet die Flucht in Android Studio.
Gegenwärtig wurden 7 Programme veröffentlicht und zwei befinden sich in der Entwicklung.
Diese Sammlung entstand als Versuch, die dabei erhaltenen Informationen zu strukturieren und zu optimieren.
Ich entschuldige mich im Voraus für möglicherweise inkorrekte Terminologie - da ich das Unterrichten durch Schöpfung praktiziere und im theoretischen Teil Lücken bestehen.

Hoffe die obigen Beispiele sind hilfreich.

So schließen Sie die Anwendung explizit programmgesteuert, wenn Sie auf die Schaltfläche klicken:


finish();


Wahrscheinlicherer Ausstieg (API 15+)

Intent intent = new Intent(Activity.this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
finish();


Oder wir schreiben in AndroidManifest.xml vor - android: noHistory = "true" Mit

diesen Einstellungen können Sie vermeiden, frühere Aktivitäten zu umgehen, anstatt sie zu beenden.








So verwenden Sie Melodien und Vibration:
Codebeispiel:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
try {
                        MediaPlayer mp = MediaPlayer.create(context.getApplicationContext(), alert);
                        mp.setVolume(100, 100);
                        mp.start();
                        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                mp.release();
                            }
                        });
                    } catch (Exception e) {
                        Toast.makeText(context, "Error default media ", Toast.LENGTH_LONG).show();
                    }


Unabhängig davon, wie leise der Sound ist: stackoverflow.com/questions/8278939/android-mediaplayer-volume-is-very-low-already-adjusted-volume

Für Vibrationen müssen Sie sich im Manifest registrieren

Code selbst:

vibrator = (Vibrator) getSystemService (VIBRATOR_SERVICE);
vibrator.vibrate(400);





Mit Text arbeiten:
Farbe:

builder.setMessage(Html.fromHtml("John:"+"How are you?"))


Textausrichtung des Dialogfelds:
stackoverflow.com/questions/3965122/android-how-to-align-message-in-alertdialog

Textformatierung:
stackoverflow.com/questions/3235131/set-textview-text-from-html-formatted-string- resource-in-xml

Schatten auf Text:

textv.setShadowLayer(1, 0, 0, Color.BLACK);



So ändern Sie die Aktivität:

Intent intent = new Intent(MainActivity.this, Level002Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Если не хотим сохранять историю
startActivity(intent);



Einfache Klickbearbeitungsvorlage:
1. In der Zeile public class MyActivity extend Activity, add implements View.OnClickListener stellt sich Folgendes heraus:

public class MyActivity extends Activity implements View.OnClickListener {

2. Deklarieren Sie die Variable Button btn;
3. In onCreate registrieren

btn =(Button) findViewById(R.id.btn);
btn.setOnClickListener(this);

4. Erstellen Sie eine Prozedur:

public void onClick(View v) {
        // по id определеяем кнопку, вызвавшую этот обработчик
        switch (v.getId()) {
            case R.id.btn:
                //Прописываем действие по нажатию 
                break;
        }
    }



Popup-Nachrichtenausgabe:

Toast.makeText(this, "Текст сообщения", Toast.LENGTH_SHORT).show();



Transparenz auf Activiti setzen:
stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android
android:theme="@android:style/Theme.Translucent.NoTitleBar"



Dialogaufruf:
startandroid.ru/ru/uroki/vse-uroki-spiskom/119-urok-60-dialogi-alertdialog-title-message-icon-buttons.html
Beispielcode:

protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_EXIT) {
            AlertDialog.Builder adb = new AlertDialog.Builder(this);
            // заголовок
            adb.setTitle(R.string.Help);
            // сообщение
            // adb.setMessage(R.string.HelperD);
            adb.setMessage(this.getResources().getText(R.string.helpMain));
            // иконка
            adb.setIcon(R.drawable.ic_launcher);
            // кнопка положительного ответа
            adb.setPositiveButton( getResources().getString(R.string.close),myClickListener);
            // кнопка отрицательного ответа
            return adb.create();
        }
        return super.onCreateDialog(id);
    }
    DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                // положительная кнопка
                case Dialog.BUTTON_POSITIVE:
                    //  saveData();
                   // Intent intent = new Intent(MyActivity.this, MyActivity.class);
                  //  startActivity(intent);
                    // finish();
                    break;
            }
        }
    };

Aufruf: showDialog (DIALOG_EXIT);


Zeichenfolge aus Ressourcen abrufen:

String mess = getResources().getString(R.string.mess_1);



Fang Ausnahmen:
stackoverflow.com/questions/5984507/sharedpreferences-getintcumulative-0-catch-22-how-to-resolve
habrahabr.ru/post/129582

Der Code sieht folgendermaßen aus:

  try {
// Выполняется
 } 
catch (Exception e) {
            // исключение
         }



Abrufen des Zeitformats auf einem 24/12-Gerät:

android.text.format.DateFormat.is24HourFormat(context)

muratonnet.blogspot.ru/2013/08/when-i-was-developing-date-time-picker.html


Zugang zu Ressourcen:

getResources().getColor(R.color.errorColor)







Stapel leeren:


Beispielcode für stackoverflow.com/questions/7075349/android-clear-activity-stack :

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);





Mit Benachrichtigungen arbeiten:
startandroid.ru/ru/uroki/vse-uroki-spiskom/164-urok-99-service-uvedomlenija-notifications.html
developer.android.com/design/patterns/notifications.html
developer.android.com/guide/topics/ ui / notifiers / notifications.html

Für api <16

void sendNotif(Context context) {
        nm = (NotificationManager) 	context.getSystemService(context.NOTIFICATION_SERVICE);
        String msgText = "Текст Сообщения";
        Notification notif = new Notification(R.drawable.ic_launcher, "Статус строка сообщения",
                System.currentTimeMillis());
        Intent intent = new Intent(context, options.class);
        intent.putExtra(MyActivity.FILE_NAME, "somefile");
        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
        notif.setLatestEventInfo(context, "Статус строка сообщения", msgText, pIntent); 
        // ставим флаг, чтобы уведомление пропало после нажатия
        notif.flags |= Notification.FLAG_AUTO_CANCEL;
        // отправляем, цифра ID сообщения.
        nm.notify(1, notif);
    }
//Для api>15
    void sendNotif16(Context context) {
        String msgText =  "Текст Сообщения";
        NotificationManager notificationManager =getNotificationManager(context);
        PendingIntent pi = getPendingIntent(context);
      Notification.Builder builder = new Notification.Builder(context);
        builder.setContentTitle("NotificationTitle")
                .setContentText("Текст отображаемый в свернутом виде")
                .setSmallIcon(R.drawable.ic_launcher)
                .setAutoCancel(true)
        .setPriority(Notification.PRIORITY_HIGH)
.addAction(R.drawable.ic_launcher,context.getResources().getString(R.string.NotificationButton), pi);
        Notification notification = new Notification.BigTextStyle(builder)
                .bigText(msgText).build();
        notificationManager.notify(1, notification);
    }
public NotificationManager getNotificationManager(Context context) {
        return (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
    }
//Вызов:
if (Build.VERSION.SDK_INT < 16) {
                        sendNotif(context);
                    } else {
                        sendNotif16(context);
                    }
//Отмена 
public static void CancelNotification(Context ctx, int notifyId) {
        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
        nMgr.cancel(notifyId);
    }



Bildschirm eingeschaltet lassen
stackoverflow.com/questions/5331152/correct-method-for-setkeepscreenon-flag-keep-screenon Codebeispiel

:

In XML android: keepScreenOn = "true" oder in einem Programm:
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);



Android Emulator:
www.genymotion.com Das
Beste, das ich je getroffen habe, ist nicht immer stabil, aber schnell.


Erstellen Sie eine Tabelle:
stackoverflow.com/questions/13189790/how-to-draw-horizontal-and-vertical-line-in-table-layout

Beispielcode:

TableLayout table = (TableLayout) findViewById(R.id.score_table);
        // create a new TableRow
        TableRow row = new TableRow(this);
        // create a new TextView
        TextView t = new TextView(this);
        t.setBackgroundResource(R.drawable.cell_shape);
        t.setPadding(5,5,5,5);
        View view_instance = (View)findViewById(R.id.txt1);
        ViewGroup.LayoutParams params=view_instance.getLayoutParams();
        t.setLayoutParams(params);
        t.setText(data) ;
        t.setTextColor(getResources().getColor(R.color.windowBackground));    
row.addView(t);
table.addView(row,new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.FILL_PARENT)); 



Handhabung des zurückgedrückten Knopfes:
stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity

Beispielcode:

public void onBackPressed() {
        Intent intent = new Intent(Activity1.this, Activity2.class);
        startActivity(intent);
        super.onBackPressed();
    }   









Fokus mit EditText verschieben:
stackoverflow.com/questions/17989733/move-to-another-edittext-when-soft-keyboard-next-is-clicked-on-android
Wird in XML verwendet
android:imeOptions="actionNext"

zu vervollständigen
android:imeOptions="actionDone"





Vorübergehendes Verbot der Änderung der Ausrichtung der Tätigkeit:
stackoverflow.com/questions/3611457/android-temporarily-disable-orientation-changes-in-an-activity
stackoverflow.com/questions/2795833/check-orientation-on-android-phone/10453034#10453034
stackoverflow.com/questions/ 3611457 / android-deaktiviert-vorübergehend-die-ausrichtung-bei-einer-aktivität

Dies wird nicht empfohlen, aber wenn nötig.
Hier ist ein Beispiel für eine relativ stabile Implementierung:

private static void disableRotation(Activity activity)
    {
        WindowManager windowManager =  (WindowManager) 	activity.getSystemService(Context.WINDOW_SERVICE);
     	   Configuration configuration = activity.getResources().getConfiguration();
      		  int rotation = windowManager.getDefaultDisplay().getRotation();
        // Search for the natural position of the device
        if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
                (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||
                configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&
                        (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))
        {
            // Natural position is Landscape
            switch (rotation)
            {
                case Surface.ROTATION_0:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
                case Surface.ROTATION_90:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
                    break;
                case Surface.ROTATION_180:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                    break;
                case Surface.ROTATION_270:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
            }
        }
        else
        {
            // Natural position is Portrait
            switch (rotation)
            {
                case Surface.ROTATION_0:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
                case Surface.ROTATION_90:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
                case Surface.ROTATION_180:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
                    break;
                case Surface.ROTATION_270:
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                    break;
            }
        }
    }
    private static void enableRotation(Activity activity)
    {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }



Verwenden von AlarmManager für Erinnerungen:
www.mobilab.ru/androiddev/androidalarmmanagertutorial.html
stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time
developer.android.com/reference/android/app/AlarmManager.html
stackoverflow.com/questions/2844274/multiple-calls-to-alarmmanager-setrepeating-deliver-the-same-intent-pendinginten

Возобновление после перезагрузки:
stackoverflow.com/questions/12512717/android-alarmmanager-after-reboot
github.com/commonsguy/cw-omnibus/blob/master/AlarmManager/Scheduled/src/com/commonsware/android/schedsvc/PollReceiver.java
stackoverflow.com/questions/4315611/android-get-all-pendingintents-set-with-alarmmanager
Пример кода с вызовом после перезагрузки (не оптимальный нужно дорабатывать):
В манифесте прописываем:


BootReceiver.java
public class BootReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmManagerBroadcastReceiver.setTime=3;
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "EyeGuard");
        SetAlarm(context);
    }
    }
    public void SetAlarm(Context context)
    {
        //Toast.makeText(context, "SetAlarm", 10).show();
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(AlarmManagerBroadcastReceiver.ONE_TIME, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        //After after 30 seconds
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * AlarmManagerBroadcastReceiver.setTime *60 , pi); /// 1000
    }
    public void CancelAlarm(Context context)
    {
       // Toast.makeText(context, "CancelAlarm", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}
AlarmManagerBroadcastReceiver.java
public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
AlarmManagerBroadcastReceiver.setTime=3;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "EyeGuard");
wl.acquire(10000); //Засыпает через 10 секунд
                    //Здесь свой код
                    //
    }
    public void SetAlarm(Context context)
    {       
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000  *setTime *setTime2 , pi); /// 1000  *25   *60
    }
    public void CancelAlarm(Context context)
    {
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
    public void setOnetimeTimer(Context context){
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.TRUE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
    }
}



Registrieren Sie in der Aktivität, von der aus wir anrufen, den Alarm Private AlarmManagerBroadcastReceiver.
In onCreate:

alarm = new AlarmManagerBroadcastReceiver();

Prozeduren hinzufügen:

public void startRepeatingTimer(View view) {
        //   Toast.makeText(this, "startRepeatingTimer", 30).show();
        Context context = this.getApplicationContext();
        if(alarm != null){
            alarm.SetAlarm(context);
        }else{
            //Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
        }
    }
    public void cancelRepeatingTimer(View view){
        //  Toast.makeText(this, "cancelRepeatingTimer", 30).show();
        Context context = this.getApplicationContext();
        if(alarm != null){
            alarm.CancelAlarm(context);
        }else{
           // Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
        }
    }

Der Aufruf erfolgt:
startRepeatingTimer (v); Abbrechen
:
cancelRepeatingTimer (v);


So schalten Sie den Bildschirm über das Programm ein:
developer.android.com/reference/android/os/PowerManager.html
stackoverflow.com/questions/18679455/in-android-how-can-i-turn-off-the-screen-programatically
pastebin.com/RyjTF08K
stackoverflow.com / questions / 13696891 / programmatically-set-screen-to-off-in-android
forum.xda-developers.com/showthread.php?t=1210421
developer.android.com/reference/android/os/PowerManager.html#goToSleep % 28long

Im Manifest hinzufügen:
< uses-permission android:name="android.permission.WAKE_LOCK" />


Code selbst:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();



Ein bisschen über Admob:
forum.hellroom.ru/index.php?PHPSESSID=6ef77d2e403cac8c366ce8f5a9e3f9fa&topic=16515.0
habrahabr.ru/post/133858
habrahabr.ru/post/203368
Пример кода:
В Манифест добавляем:

Прописываем в активити import com.google.android.gms.ads.*;
В onCreate:

adView = new AdView(this);
        adView.setAdUnitId("код баннера");
        adView.setAdSize(AdSize.SMART_BANNER);
        // Поиск разметки LinearLayout (предполагается, что ей был присвоен
        // атрибут android:id="@+id/mainLayout").
        RelativeLayout layout = (RelativeLayout)findViewById(R.id.RLMain);
        // Добавление в разметку экземпляра adView.
        layout.addView(adView);
        // Инициирование общего запроса.
        // AdRequest adRequest = new AdRequest.Builder().build();
        AdRequest adRequest = new AdRequest.Builder().build();
//Для теста разкомментируем строчки и подставляем ID тестового девайса
     /*   AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)       // Эмулятор
                .addTestDevice("B6F0A0DED6232ADEA16984CB963C6552") // Тестовый телефон Galaxy Nexus
                .build();*/
        // Загрузка adView с объявлением.
        adView.loadAd(adRequest);
@Override
    public void onPause() {
        adView.pause();
        super.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
        adView.resume();
    }
    @Override
    public void onDestroy() {
        adView.destroy();
        super.onDestroy();
    }














Как дать возможность оставить отзыв из программы:
stackoverflow.com/questions/2893350/how-to-launch-the-google-play-intent-in-give-feedback-mode-on-android
stackoverflow.com/questions/8031276/prompt-user-to-rate-an -android-app-in-der-app

Beispielcode:

String appPackageName= getPackageName();
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+appPackageName));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(marketIntent);




Jetzt auch beliebt: