Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как сделать меню состояшее с отдельных частей

Всем привет,

Мучаю Android ... Столкнулся с проблемой что не могу найти примера с меню состоящим из нескольких часте:

(IMG:)

Вот как в примере выше. Слева от Shedule кнопка в виде трех полосок, а справа кнопки поиска и три точки выпадающего меню.
Я не нашел не одного примера как перенести кнопку в виде трех полосок влева.

У меня же получилось следующее:



Может ли кто нибудь подсказать как поменять стиль или параметры меню чтобы кнопка с трем полосками сместилась влево ?

Буду весма признателен !!
Ответ:
Создадим приложение с двумя пунктами в options-меню. Один пункт — refresh вынесем как иконку в Action Bar, а второй — settings будет отображаться только в меню
Вопрос: Переключение Layout ПОД меню

Я имею меню (оно состоит из нескольких XML файлов),имею множество conten.xml файлов,нужно сделать так чтоб по нажатию на определенный пункт меню открывался нужный layout (в одном из xml файлов меню располагается задняя часть меню (грубо говоря сам контент)) . Пробовал подгружать Layout в меню при помощи ViewSub и include (ясен пень ничего не вышло так как один нельзя программно менять а другой нельзя менять после создания).
Собственно вопрос в том как это сделать и если можно с примерами кода.
Ответ: напишите за меня в другом разделе

где твой код, разметки и так далее?
Вопрос: Не отображается пункт меню в ActionBar

Приветствую,

Сделал меню
Код XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="ru.blablabla.app.MainActivity" >
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />
    <item android:id="@+id/action_operation"
        android:title="operation"
        android:icon="@drawable/ic_launcher"
        app:showAsAction="always" />
</menu>
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
В превью иконка появляется в ActionBar, запускаю приложение - нету. Что может быть?
Ответ: У меня в правом углу тупо отсутствуют три точки изображающие меню...я сменил значение невер на олвейс и появилась надпись сеттинг...как сделать что бы были три точки то?

Добавлено через 21 минуту
простите сменил эмулятор с 17 на 19 и все норм
Вопрос: Как сделать меню аккордеон в Android приложении

Нужно реализовать меню аккордеон, в котором есть список объектов, в интернете не нашел путной инфы о том как сделать такое меню, может кто знает как это можно сделать? и есть ли какие стандартные средства для этого?
Ответ:
Вопрос: Как сделать меню в шаблоне Google maps Activity Android studio

Здравствуйте создал шаблон google maps хотел разместить елементи управления.
И у меня не получается потому-что:
На форму не могу разместить кнопки среда не разрешает.
Меню вроде как подключаю но оно не отображаеться.
Помогите пожалуйста.
Мне нужна:
Лыбо документация на эту тему.
Или пример.
Или хоть-что-то.
Ответ: Только с этим.
Вопрос: Отображение меню в OptionMenu в трёх точках

Смартфон на android 4.2.2

Хочу сделать меню чтоб была кнопка "Добавить", в виде иконки с изображением.

код xml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".CrimeListActivity">
    <item
        android:id="@+id/menu_item_new_crime"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/new_crime"
        app:showAsAction="ifRoom|withText"
        />
        <item
        android:id="@+id/menu_option"
        android:title="@string/option"
        />
</menu>

Добавляю его в фрагмент через метод



Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_crime_list, menu);
    }
Потом
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
}
Проблема в том, что меню отображается только когда нажимаю кнопку опций на самом смартфоне!
А мне нужно чтоб один пункт меню отображался иконкой на екшен баре, а в торой в виде меню трех точек ?
в чем может быть проблема? И как ее решить ?
Ответ:
XML
1
app:showAsAction="ifRoom|withText"
withtext тут лишний, система просто может считать что не хватает места в тулбаре и не показывает ни иконку ни текст, если не будет текста, с большой вероятностью одна иконка вместится
Вопрос: Ошибка при парсинге или как лучше сделать?

Ребята помогите пожалуйста. В папке assets у меня 7 txt. файлов.7 вопросов.

По нажатию на кнопку, происходит парсинг каждого файла и выводится вопрос, но когда делаешь

8 нажатие выскакивает ошибка, мол 8 файла нет.Оно и понятно, ведь его действительно нет.

Так как у меня парсинг происходит в отдельном класе, то в MainActivity

каждый фаил записывается в стринг переменную и потом разбивается на токины.

Java
1
2
String s1 = LoadTXT.TXT(this, parsing_txt);// записываем содержимое файла в переменную типа string
                     StringTokenizer st1 = new StringTokenizer(s1, "*");
Я решил сделать вот такую проверку:

Java
1
2
3
4
5
String end =  "8.txt";// файла которого нет
 
                 if(parsing_txt.equals(end)){
                     displayResult();
                 }

Я сравнил два стринга и все работает. Однако, препАД не принимает такую реализацию, говорит можно сделать все проще.

Подскажите как? интовую переменную, которая подсчитывает номер вопроса тоже использовать нельзя.
Ответ: Ребята, взял часть кода где возникает ошибка в try-catch и решил не париться.
Вопрос: Кусок кода в отдельный класс

Ребята, всем доброй ночи. Написал я свою первую программу тест, но мама мия! У меня не activity а простыни какие то. И я понимаю, что со временем будет только хуже и жутко не удобно. Вычитал, что можно функции вынести в отдельный класс и подключатся к нему из главной activity, а вот сделать это на практике не могу. P.S. Может есть книги где можно почитать как это сделать?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 if(reed==12){ // ecли пройдено 12 ячеек
                if(tobe){// если нажат пункт меню ToBe...
                    if(mySettings1.contains(Tobe_ArrayList)){// если сохранен Tobe_ArrayList
 
                        SharedPreferences.Editor editor = mySettings1.edit();
                        editor.remove("Tobe_ArrayList"); // удаляем Tobe_ArrayList
                        editor.apply();
 
 
                        displayResult2();
 
                    }
                    else {//ecли пройдено 12 ячеек и нажат пункт меню ToBe, но НЕ сохранен Tobe_ArrayList
 
                        displayResult();
 
                        listStr = new Gson().toJson(new ArrayList<Integer>(Arrayl));// сохраняю Arrayl в строку
 
                        Log.d("","Сохраненный Tobe_ArrayList:" + Arrayl);
 
                        SharedPreferences.Editor editor = mySettings1.edit();
                        editor.putString(Tobe_ArrayList, listStr);// cохраняем Arrayl в строке в SharedPreferences
                        editor.apply();
                    }
 
 
            }//End Push_ToBe
 
            }//if(reed==12)
 
          if(itenglish){// если нажат пункт меню IT English
 
            if(reed==12){// ecли пройдено 12 ячеек
 
                if(mySettings1.contains(ITenglish_ArrayList)){// если сохранен ITenglish_ArrayList
 
                    SharedPreferences.Editor editor = mySettings1.edit();
                    editor.remove("ITenglish_ArrayList"); // удаляем ITenglish_ArrayList
                    editor.apply();
 
 
                } // End ITenglish_ArrayList
 
                else{//ecли нажато меню IT English и пройдено 12 ячеек, но НЕ сохранен параметр ITenglish_ArrayList
 
                    displayResult();
 
                    listStr = new Gson().toJson(new ArrayList<Integer>(Arrayl));// сохраняю Arrayl в строку
                    System.out.println("Сохраненный ITenglish_ArrayList" + Arrayl);
 
                    SharedPreferences.Editor editor = mySettings1.edit();
                    editor.putString(ITenglish_ArrayList, listStr);// cохраняем Arrayl в строке в SharedPreferences
                    editor.apply();
                }
 
            }// End reed
 
          }// End itenglish
Ответ: есть несколько варриантов как это сделать, зависит от самой функции.
1) Делаются классы Utils, с паблик статик функциями, например если в приложении надо конвертировать миллисекуны в дни, или в часы, то делаем класс ConvertUtils, в нем деалаем:
Java
1
2
3
4
5
public static int milliToDays(long millisec){
int days = 0;
//конвертируем 
return days;
}
и теперь с мейн активити просто вызываем Названиекласса.названиефункции,int days = ConvertUtils.milliToDays(121211213);

таким образом все методы связанные в одну общую тему будут лежать в одном ютилс и можно с любого места в проекте их достать.

2) Создание обьектов или вью со своими функциями. например если в строчке есть кнопка и эдит текст, можно их запихнуть в один класс, и в нем выполнять операции связанные с этими двумя обьектами а в мейн только возвращать результат. это посложнее.
3) создание менеджеров. например у Вас в проекте повторяются ШаредПреференс, их можно запихнуть в менеджер, создать класс шаредпреференсменеджер, обычно такие классы синглтон, и в нем собрать список всех функций которые по теме шардпреференс. так же такой менеджер может быть статическим классом как в первом случае. сингл тон обычно не советуют использовать, он может делать лики, им надо уметь пользоваться и правельно передавать ему контекст.

есть еще варрианты, но думаю этого хватит чтоб навести порядок в проекте
еще, посмотрите что такое повторение кода, этого тоже надо избегать.
еще, посмотрите что такое нейминг, тоже облегчает работу
удачи
Вопрос: Как во flutter сделать навигацию меняющую только body

Всем привет. Начал изучать flutter и хочу сделать следующее: запускаю приложение, вижу главный экран. Свайпом вправо выдвигаю панель drawer в которой у меня есть некоторые меню. При выборе меню нужно что бы в текущем "Activity" (Если это так можно назвать) заменялись данные внутри тэга "body". Сейчас же у меня открывается новый "Activity" в котором расположена кнопка. Как реализовать что бы менялся только тэг "body"?

main.dart:
Javascript
1
2
3
4
5
6
7
8
9
import 'package:flutter/material.dart';
import 'package:mg_by/App/mainScreen.dart';
 
void main() {
  runApp(MaterialApp(
    title: 'Приложение',
    home: MainScreen(),
  ));
}
mainScreen.dart:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import 'package:flutter/material.dart';
import 'package:mg_by/App/Second.dart';
 
class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey,
      appBar: new AppBar(
        leading: new Icon(Icons.menu),
        title: new Text("Приложение"),
        actions: <Widget>[
          new IconButton(
            icon: new Icon(Icons.shopping_cart),
            onPressed: () {},
          ),
          new IconButton(
            icon: new Icon(Icons.monetization_on),
            onPressed: () {},
          )
        ],
      ),
      body: new Container(
        color: Colors.red,
      ),
      // Этот виджет представляет собой DrawerLayout в Android, который выезжает из левой части Activity для отображения навигационных ссылок приложения.
      drawer: new Drawer(
        child: new ListView(
          children: <Widget>[
            new DrawerHeader(
              child: new Text("Drawer Header"),
              decoration: new BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              title: Text('Второй экран'),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondScreen()),
                );
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}
Second.dart:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import 'package:flutter/material.dart';
 
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:
      Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Вернуться назад.'),
        ),
      ),
    );
  }
}
Ответ: Решение:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import 'package:flutter/material.dart';
 
class MainScreen extends StatefulWidget {
  _MainScreen createState() => _MainScreen();
}
 
class _MainScreen extends State<MainScreen> {
  var page = 'main';
 
  _getMainScreen(page) {
    if (page == 'main') {
      return new Container(
        color: Colors.red,
      );
    } else {
      return new Container(
        color: Colors.red,
        child: Center(
          child: RaisedButton(
            onPressed: () {
              setState(() {
                this.page = 'main';
              });
            },
            child: Text('Вернуться назад.'),
          ),
        ),
      );
    }
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey,
      appBar: new AppBar(
        leading: new Icon(Icons.menu),
        title: new Text("Приложение"),
        actions: <Widget>[
          new IconButton(
            icon: new Icon(Icons.shopping_cart),
            onPressed: () {},
          ),
          new IconButton(
            icon: new Icon(Icons.monetization_on),
            onPressed: () {},
          )
        ],
      ),
      body: _getMainScreen(page),
 
      // Этот виджет представляет собой DrawerLayout в Android, который выезжает из левой части Activity для отображения навигационных ссылок приложения.
      drawer: new Drawer(
        child: new ListView(
          children: <Widget>[
            new DrawerHeader(
              child: new Text("Drawer Header"),
              decoration: new BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              title: Text('Второй экран'),
              onTap: () {
                setState(() {
                  page = 'second';
                });
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                setState(() {
                  page = 'main';
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}
Вопрос: Показ невидимой части картинки анимацией

Я пишу программу в горизонтальной ориентации.

У меня есть картинка размером 512х652 пикселя.

Я хочу, чтобы картинка, не меняя пропорции сторон, растянулась по ширине экрана(длинная часть).

После этого картинка в таком положении должна проплыть по экрану снизу вверх, тем самым показав невидимые области по высоте.

Как это сделать не знаю даже примерно, потому кода нет.

Прошу помощи.
Ответ: prouraist, если изображение вставить в ImageView, то его обрежет и двигать будет нечего. Можно сделать при помощи рисования в SurfaceView. взял пример кода и переписал чутка. Подходит для любого изображения. показывает верхнюю часть картинки растягивая по ширине без изменения пропорций. при нажатии на экран двигается вверх до нижнего края. В манифесте для этого Activity ставил android:screenOrientation="landscape". Получилось много кода:

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
 
 
public class MainActivity extends Activity implements OnClickListener,
        SurfaceHolder.Callback {
 
    Bitmap bitmap;
    SurfaceView surfaceView;
    DrawingThread thread;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //загружаем изображение
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sun);
 
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceView.getHolder().addCallback(this);
        surfaceView.setOnClickListener(this);
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread = new DrawingThread(holder, bitmap);
        thread.start();
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}
 
    @Override
    public void onClick(View v) {
        thread.startMotion();
    }
 
    @Override
    public void onBackPressed() {
        thread.quit();
        thread = null;
        finish();
    }
 
    private static class DrawingThread extends HandlerThread implements Handler.Callback {
 
        private static final int SHOW = 1;
        private static final int MOVE = 2;
        private SurfaceHolder holder;
        private Handler handler;
        private Bitmap bitmap;
        private int deltaY;
        private int bitmapY = 0;
 
        public DrawingThread(SurfaceHolder holder, Bitmap bitmap) {
            super("DrawingThread");
            this.holder = holder;
            this.bitmap = bitmap;
        }
 
        @Override
        protected void onLooperPrepared() {
            handler = new Handler(getLooper(), this);
            handler.sendEmptyMessage(SHOW);
        }
 
        public void startMotion() {
            handler.sendEmptyMessage(MOVE);
        }
 
        @Override
        public boolean quit() {
            handler.removeCallbacksAndMessages(null);
            return super.quit();
        }
 
        @Override
        public boolean handleMessage(Message msg) {
            Canvas canvas;
            switch (msg.what) {
                case SHOW:
                    bitmapY = 0;
                    canvas = holder.lockCanvas();
 
                    //подгоняем изображение под размер экрана
                    float scaleCoefficient = (float)canvas.getWidth() / (float)bitmap.getWidth();
                    int dstWidth = canvas.getWidth();
                    int dstHeight = (int) (bitmap.getHeight() * scaleCoefficient);
                    bitmap = Bitmap.createScaledBitmap(bitmap, dstWidth, dstHeight, false);
 
                    //определяем на какое расстояние будет двигаться изображение
                    this.deltaY = canvas.getHeight() - bitmap.getHeight();
 
                    canvas.drawBitmap(bitmap, 0f, 0f, null);
                    holder.unlockCanvasAndPost(canvas);
                    return true;
                case MOVE:
                    canvas = holder.lockCanvas();
                    canvas.drawBitmap(bitmap, 0f, bitmapY, null);
                    holder.unlockCanvasAndPost(canvas);
                    bitmapY -=2;
                    if(bitmapY < deltaY) {
                        handler.sendEmptyMessage(SHOW);
                        return true;
                    }
            }
            handler.sendEmptyMessage(MOVE);
            return true;
        }
    }
}