Ответы пользователя по тегу Android
  • Как сделать добавление CardView при загрузке контента динамически?

    a13xsus
    @a13xsus
    Lazy developer
    Держи https://goo.gl/IGjNnW вроде парсит
    Код ужасен, его нужно рефакторить.

    Только вынеси адаптер в асинктаске из цикла фор, чтобы получилось вот так
    4a2c57ff555f4abea8a3c4f16f8b5965.png
    Ответ написан
    Комментировать
  • Как запомнить активити в android?

    a13xsus
    @a13xsus
    Lazy developer
    У тебя в OnCreate должен быть слушатель AuthStateListener с методом onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth). Файрбейс сам проверяет авторизирован ли юзер, сам сохраняет токен, тебе лишь только надо написать смену активити, передачу токена дальше и пр.

    FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() {
               @Override
                public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                    FirebaseUser user = firebaseAuth.getCurrentUser();
                    if (user != null) {
                        // User is signed in
                        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    } else {
                        // User is signed out
                        Log.d(TAG, "onAuthStateChanged:signed_out");
                    }
                    updateUI(user);
                }
    };
    Ответ написан
  • Как сделать автоматическое добавление Layouts?

    a13xsus
    @a13xsus
    Lazy developer
    RecyclerView + Adapter + CardView
    https://code.tutsplus.com/tutorials/getting-starte...
    Ответ написан
    Комментировать
  • Как включить поддержку GPS на эмуляторе Android?

    a13xsus
    @a13xsus
    Lazy developer
    В настройках штатного эмуляторя от Гугла (который вместе со студией устанавливается) можно задать координаты gps, приложение соответственно будет их видеть. В других эмуляторах - зависит от производителя по.
    Ответ написан
  • Почему происходит шибка при создании БД (SQLite)в Android приложении?

    a13xsus
    @a13xsus
    Lazy developer
    private static final int DATABASE_VERSION = 1;

    > Can't downgrade database from version 2 to 1

    У устройства версия 2, ты пытаешься ему подсунуть 1.
    Ответ написан
    6 комментариев
  • Как вводить в button строчные буквы?

    a13xsus
    @a13xsus
    Lazy developer
    В xml каждой кнопки либо в styles добавь
    android:textAllCaps="false"
    Ответ написан
    Комментировать
  • Старт нового Activity с помощью spinner?

    a13xsus
    @a13xsus
    Lazy developer
    Как выше уже было указано: https://developer.android.com/guide/topics/ui/cont...

    public class MainActivity implements AdapterView.OnItemSelectedListener {
        ...
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ....
            Spinner spinner = (Spinner) findViewById(R.id.spinner);
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                    R.array.planets_array, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);
            spinner.setOnItemSelectedListener(this);
        }
    
        ...
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            parent.getItemAtPosition(position);
            switch (position) {
                case 0:
                    return;
                    //этот будет срабатывать сразу при отображении спиннера
                case 1:
                    Intent intent = new Intent(this, Main2Activity.class);
                    startActivity(intent);
                    return;
                case 2:
                    Intent intent = new Intent(this, Main3Activity.class);
                    startActivity(intent);
                    return;
            }
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
    
        }
    
    }


    strings.xml:
    <string-array name="planets_array">
            <item>Mercury</item>
            <item>Venus</item>
            <item>Earth</item>        
    </string-array>
    Ответ написан
  • Как локализовать java?

    a13xsus
    @a13xsus
    Lazy developer
    public class MainActivity {
    ...
    	public String BEST_TEXT;
    	public String SCORE_TEXT;
    	public String BEST_TEXT_GAME;
    	...
    
    	@Override
        protected void onCreate ... {
        ...
        BEST_TEXT = getString(R.string.BEST_TEXT);
        SCORE_TEXT = getString(R.string.SCORE_TEXT);
        ...


    res/values/strings.xml
    <string name="BEST_TEXT">High Score:" "</string>

    res/values-ru/strings.xml
    <string name="BEST_TEXT">Рекорд:" "</string>

    static final объявлять не нужно, ресурсы и так являются константами.
    Ответ написан
  • Navigation Drawer, как изменить Header?

    a13xsus
    @a13xsus
    Lazy developer
    В логе не пусто, а nullpointerexception. Следовательно, нужно найти сам хедер и у него найти вью:

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    ...
    View navHeader = navigationView.getHeaderView(0);
    TextView twNavBarName = (TextView) navHeader.findViewById(R.id.nav_header_tw_name);
    twNavBarName.setText("automatik");
    Ответ написан
    Комментировать
  • Как сделать Material Intro на двух языках?

    a13xsus
    @a13xsus
    Lazy developer
    Английские строки.
    res/values/strings.xml
    <string name="hello_world">Hello World</string>
    ...

    Российские строки.
    res/values-ru/strings.xml
    <string name="hello_world">Привет, Мир</string>
    ...
    Ответ написан
  • Почему вылетает приложение Android при переходе на новое Activity?

    a13xsus
    @a13xsus
    Lazy developer
    Стактрейс покажите, что-ли. Судя по скрину вылетает uncaught exception, вероятно Unable to instantiate activity ComponentInfo. Всё из-за того, что у вас до OnCreate инициализируется вьюха:

    private TextView Sum = (TextView) findViewById(R.id.textView9);


    Тут null, поскольку этот TextView ещё не существует. Нужно инициализировать в OnCreate, после setContentView():

    public class ActivityCalc extends AppCompatActivity {
        private TextView Sum;
        ...
        
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_calc);
            ...
            Sum = (TextView) findViewById(R.id.textView9)
    Ответ написан
    2 комментария
  • Как добавить третий элемент в строку меню в navigation drawer?

    a13xsus
    @a13xsus
    Lazy developer
    Да, можно. Это actionLayout. Указывается в самой разметке меню:

    <menu>    
        <item
            android:id="@+id/messages_item"
            android:icon="@drawable/ic_notifications_neg"
            app:actionLayout="@layout/counter"
            android:title="@string/message_center"/>
    
        <item
            android:id="@+id/search_item"
            android:icon="@drawable/ic_search_neg"
            android:title="@string/search"/>
    </menu>


    counter.xml:

    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="26dp"
        android:layout_height="26dp"
        android:text="14"/>
    Ответ написан
    Комментировать
  • Как узнать идентификатор приложения Android?

    a13xsus
    @a13xsus
    Lazy developer
    Если скачано из Google Play, тогда можно найти его на самом сайте магазина и из урл посмотреть id. Например,
    https://play.google.com/store/apps/details?id=com....

    com.nintendo.zara и есть идентификатор.

    Также айди можно посмотреть в самом андроиде (настройки > приложения и там найти в запущенных процессах) либо декомпилировав сам apk файл.
    Ответ написан
    Комментировать
  • Как поднять элементы?

    a13xsus
    @a13xsus
    Lazy developer
    Неплохо было бы переделать это в relativelayout. Ну а чтобы все элементы (и кнопка) поднимались над софт-клавиатурой, нужно в манифест соответствующей активити добавить android:windowSoftInputMode="adjustResize":

    <activity android:name=".MyActivity"
        android:windowSoftInputMode="adjustResize">
    </activity>


    Но тогда картинка-бекграунд у layout тоже будет сжиматься. Этого можно избежать, если задавать фон в onCreate самой активити, и убрать его из xml:

    getWindow().setBackgroundDrawableResource(R.drawable.bg);


    Сам ImageView тогда можно оставить сверху как есть, тогда он в принципе будет на месте. Правда тогда нужно будет тестить для разных экранов и ориентаций, могут быть косяки. На скорую руку я набросал так (довольно кривая разметка, но для примера сойдет):

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:local="http://schemas.android.com/apk/res-auto"
        android:id="@+id/rel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    
        android:orientation="vertical"
        android:isScrollContainer="false">
    
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:src="@drawable/firebase_lockup_400"/>
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentStart="true"
            android:background="@color/colorPrimary"
            android:text="Log In"
            android:textAllCaps="false"
            android:textColor="#FFFFFF"
            android:textSize="17sp"/>
    
        <android.support.design.widget.TextInputLayout
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/button1">
    
            <EditText
                android:id="@+id/password_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Password"
                android:inputType="textPassword"
                android:textColorHint="@android:color/white"
                android:textCursorDrawable="@drawable/star"/>
        </android.support.design.widget.TextInputLayout>
    
        <android.support.design.widget.TextInputLayout
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/text2">
    
            <EditText
                android:id="@+id/email_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Enter email"
                android:inputType="textEmailAddress"
                android:textColor="@android:color/white"
                android:textCursorDrawable="@drawable/star"/>
        </android.support.design.widget.TextInputLayout>
    
    </RelativeLayout>


    Выглядит примерно так:

    3501ba9764a8429dbadd6533a5b521b0.png
    Ответ написан
  • Как открыть файл в другом приложении на андроид?

    a13xsus
    @a13xsus
    Lazy developer
    Для API < 24:

    Мне нужно решить такую проблему: хочу, чтобы из моего приложения я мог передавать любой файл в другое приложение, которое сможет его открыть

    Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/alpha_stmoritz_train.jpg"));
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_STREAM, fileUri);
    intent.setType("image/*");
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(intent, "Share Image:"));


    К примеру, открыть фото в галерее. Как это сделать?

    Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) +
                    "/alpha_stmoritz_train.jpg"));
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(fileUri, "image/*");
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(intent);


    Для Andorid 7 Nougat (API >=24) необходимо использовать FileProvider, т.к. Uri.fromFile() будет вызывать FileUriExposedException.

    1. В AndroidManifest.xml добавляем:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    и после активити тега:
    <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>


    2. Создаем xml/provider_paths:
    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <root-path name="root" path="." />
    </paths>


    3. Обязательно даем разрешения на Storage для нашего приложения в настройках приложения (либо пишем код, который их будет спрашивать).

    4. Пишем Intent:
    String localUri = "/storage/emulated/0/Pictures/alpha_stmoritz_train.jpg"; //тут уже как хотите так и формируйте путь, хоть через Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + имя файла
    File file = new File(localUri);        
    Uri contentUri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
    Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
    openFileIntent.setDataAndTypeAndNormalize(contentUri, "image/*");
    openFileIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(openFileIntent);


    5. Для поддержки ранних версий API можно написать что-то типа
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          ...
    } else {
          ...
    }
    Ответ написан
  • Подходит ли MediaPlayer для разработки потокового видео на Android?

    a13xsus
    @a13xsus
    Lazy developer
    Я бы воспользовался ExoPlayer:
    https://developer.android.com/guide/topics/media/e...

    Более продвинутое, функциональное и надежное решение.
    Ответ написан
  • Как сделать, что бы при нажатии на кнопку назад приложение не сворачивалось?

    a13xsus
    @a13xsus
    Lazy developer
    Смотрим, есть ли фрагменты в стаке, если нет, то разрешаем дефолтный обработчик. Если есть — отображаем фрагмент из стака до тех пор, пока очередь не закончится. Само собой, транзакция FragmentTransaction должна быть с addToBackStack перед коммитом.

    @Override
    public void onBackPressed() {
    
        int count = getFragmentManager().getBackStackEntryCount();
    
        if (count == 0) {
            super.onBackPressed();
        } 
        else {
            getFragmentManager().popBackStack();
        }
    
    }
    Ответ написан
    1 комментарий
  • Адаптивность верстки на андроид?

    a13xsus
    @a13xsus
    Lazy developer
    Неясно, зачем использовать настолько большие значения для отступов, но если уж нужно, тогда используй предопределенные значения для каждого типа экрана из xml файла в res/values.

    Создай, например, файл dimens.xml в res/values подобного содержания

    <resources
        xmlns:android="http://schemas.android.com/apk/res/android">
        <dimen name="my_margin">250dp</dimen>
    </resources>


    И продублируй его для каждого типа экрана в папках values-large, values-sw600dp, values-xlarge и так далее, всякий раз изменяя значение my_margin на определенное для каждого типа экрана.

    Тогда в layout указывай все значения с помощью переменных. Например,

    android:layout_margin="@dimen/my_margin"

    Подробнее о поддержке разных типов экрана здесь: https://developer.android.com/guide/practices/scre...
    Ответ написан
    Комментировать
  • Могут ли андроид приложения производить несанкционированную запись аудио/видео имея разрешения на доступ к микрофону/камере?

    a13xsus
    @a13xsus
    Lazy developer
    - Да, могут. Разрешения же получены.

    - Не выдавать разрешения, отзывать выданные разрешения у подозрительных приложений. Также стоит задуматься о переходе на Android 6 и выше, там реализованы runtime permissions. То есть теперь запрос на каждое разрешение буде выдаваться непосредственно при необходимости действия, связанного с этим разрешением. Если в ранних версиях все разрешения разом принимались при установке приложения, то теперь каждое разрешение можно заблокировать либо одобрить.

    - Практически никак не защищен. Имея необходимые разрешения, приложение может тайно следить за пользователем, для многих шпионов даже root права не нужны. Конечно, Google Play всячески модерируется и приложения проверяются, однако это не панацея, а установка софта из небезопасных источников (скачанные apk) и вовсе никак не контролируются, если снята опция Заблокировать установку из небезопасных источников.

    - Android permissions
    Ответ написан
    Комментировать
  • Как на кнопке разместить иконку?

    a13xsus
    @a13xsus
    Lazy developer
    Используйте android:paddingLeft в паре с android:drawableLeft, чтобы указать отступ иконки слева от края кнопки.

    <Button
        android:paddingLeft="15dp"
        android:drawableLeft="@mipmap/ic_google"
        ... />
    Ответ написан
    1 комментарий