Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
sausagerus
226 / 3 / 0
Регистрация: 12.07.2014
Сообщений: 51
#1

Добавление navigation drawer - Android

07.04.2016, 18:13. Просмотров 409. Ответов 9
Метки нет (Все метки)

Привет, есть приложение со множеством активити... нужно запихнуть в него navigation drawer c иконками и текстом к ним. И у меня почти это удалось, но не знаю , как прикрепить иконки к тексту... от части копи-пастил поэтому прошу помощи, куда и как закрепить иконки к тексту из меню one two three ?
вот Main
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
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
 
/**
 * Created by vklamm on 31.03.2016.
 */
public class Settings extends AppCompatActivity {
 
    private String[] mPlanetTitles;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
 
    //declarations
 
    //Edittext fields for username , server, password & port information
    EditText edtIpurl, edtPort, edtUsername, edtPassword;
    //Textviews that can be clicked
    TextView databaseDel, databaseRef, magnumgmbh, contact, support;
    //imagebuttons for bottom menu
    ImageButton contacts, articles, invoices, orders;
    //string for server URL
    static String serverURL = "http://", port = ":", username = "", password ="";
    Thread newSettingsThread;
    static boolean hasVisited = false;
    SharedPreferences sp;
    static String MP = "MyPrefs";
    static String APS = "sURL", APP = "sport", APU = "uname", APPass = "pass";
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
 
        setTitle("Settings");
 
        
        mPlanetTitles = new String[]{"one", "two", "three"};
        mDrawerLayout = (DrawerLayout) findViewById(R.id.dl);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
 
 
 
 
        // Set the adapter for the list view
        //mDrawerList.setAdapter(new ArrayAdapter<String>(this,
        //        R.layout.drawer_list_item, mPlanetTitles));
        mDrawerList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mPlanetTitles));
        // Set the list's click listener
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
 
 
 
 
 
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {
 
            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                // set name if drawer closes
                //getSupportActionBar().setTitle("Settings");
                //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
 
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                //set name if drawer opens
                //getSupportActionBar().setTitle("Choose options");
                //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
 
        };
 
        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
 
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
 
 
        mDrawerList.bringToFront();
        mDrawerLayout.requestLayout();
 
        mDrawerToggle.isDrawerIndicatorEnabled();
 
 
 
 
 
 
    }
 
    /*
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    */
 
 
    //
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }
 
 
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
        Toast.makeText(Settings.this, "Drawer 2",
                Toast.LENGTH_SHORT).show();
    }
 
    //if u clicked on ||| or <- sign
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        Toast.makeText(Settings.this, "just call under the number +4917620279876 if you see it",
                Toast.LENGTH_LONG).show();
        // Handle your other action bar items...
 
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * Swaps fragments in the main content view
     */
    private void selectItem(int position) {
        // Highlight the selected item, update the title, and close the drawer
        mDrawerList.setItemChecked(position, true);
        //setTitle(mPlanetTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    }
 
/* set title
    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
        Toast.makeText(Settings.this, "Drawer 6",
                Toast.LENGTH_SHORT).show();
    }
*/
 
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            selectItem(position);
 
            String positions = parent.getAdapter().getItem(position).toString();
            int p = position;
 
            switch (p){
                case 0:
                    Toast.makeText(Settings.this, "0", Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    Toast.makeText(Settings.this, "1", Toast.LENGTH_SHORT).show();
                    break;
                default :
                    Toast.makeText(Settings.this, "3", Toast.LENGTH_SHORT).show();
            }
 
 
        }
    }
}
это XML к нему
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/dl">
 
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <!-- The navigation drawer -->
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="@color/grayBackground"/>
 
</android.support.v4.widget.DrawerLayout>
тут я так понимаю будет лежать текст из боковой меню
XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/activated_background"
    android:gravity="center_vertical"
    android:minHeight="?attr/listPreferredItemHeightSmall"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#fff" />
тут цвет при нажатии на Item из меню
XML
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item android:drawable="@color/green" android:state_activated="true"/>
    <item android:drawable="@color/green" android:state_selected="true"/>
    <item android:drawable="@color/green" android:state_pressed="true"/>
    <item android:drawable="@color/green" android:state_checked="true"/>
    <item android:drawable="@android:color/transparent"/>
 
</selector>
некие strings.xml
XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="refresh_button">refresh_button</string>
    <string name="prev_button">prev</string>
 
 
    <string name="drawer_open">Open</string>
    <string name="drawer_close">Close</string>
</resources>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2016, 18:13     Добавление navigation drawer
Посмотрите здесь:

Navigation Drawer или ViewPager Android
Navigation Drawer - ошибка Android
Android Navigation Drawer не работает
Navigation Drawer Android
Navigation Drawer OnClick Событие Android
Navigation Drawer Android
Navigation drawer Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 433
07.04.2016, 21:00     Добавление navigation drawer #2
Может глупость скажу, а почему не фрагментами? Типо так как бэ удобнее.
urayatsko
15 / 15 / 8
Регистрация: 08.04.2015
Сообщений: 36
07.04.2016, 23:16     Добавление navigation drawer #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Здравствуте, если кратко вам нужно создать свой ArrayAdapter, связать его из view, потом в добавить в него данные, и в конце добавить его к drawer. Тепер наглядно.

Так как вам нужно что бы было только текст и картинка то созданим класс который добавим у наш адаптер, и потом свяжем из View.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MenuItem {
    private  String title;
    private int imageId;
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public int getImageId() {
        return imageId;
    }
 
    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}
Передаем в адаптер наш созданый класс. У адаптере мы создаем MenuHolder для привязки к View.

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
 public class MyAdapter extends ArrayAdapter<MenuItem> {
 
        private int resource;
        private List<MenuItem> data;
        private Context context;
        private MenuHolder menuHolder;
 
        public MyAdapter(Context context, int resource, Context context1) {
            super(context, resource);
            context = context1;
        }
 
        public MyAdapter(Context context, int resource, List<MenuItem> data) {
            super(context, resource, data);
            this.context = context;
            this.resource = resource;
            this.data = data;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){
                LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(resource,parent,false);
 
                menuHolder = new MenuHolder();
             
                 /*Перед привязкой нужно создать layout в котором будет ImageView и TextView что бы мы могли показыват данные(Layout ниже)*/
                menuHolder.menuItemImg = (ImageView) convertView.findViewById(R.id.menuItemImg);
                menuHolder.menuItemTitle = (TextView) convertView.findViewById(R.id.menuItemTitle);
                convertView.setTag(menuHolder);
            }else {
                menuHolder = (MenuHolder) convertView.getTag();
            }
 
            MenuItem menuItem = data.get(position);
            if(menuItem!=null){
                menuHolder.menuItemImg.setImageResource(menuItem.getImageId());
                menuHolder.menuItemTitle.setText(menuItem.getTitle());
            }
 
            return convertView;
        }
        /*Создаем класс для привзяки данных из View*/
        public class MenuHolder {
            ImageView menuItemImg;
            TextView menuItemTitle;
        }
    }
menu_item.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/menuItemImg" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/menuItemTitle" />
</LinearLayout>
Осталось все настроить в нашем activity, для этого сначала в методе onCreate создадим наш список елементов, которые будут отображатся.Я не муду копировать ваш код, просто напишу что нужно добавить к нему.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        /****************************/
 
 
        List<MenuItem> menuItems = new ArrayList<>();
        
        /*Создам только один элемент, для наглядности, но вы можете создавать обэкты сколько вам угодно*/
        MenuItem menuItem = new MenuItem();
        menuItem.setImageId(R.mipmap.ic_launcher);
        menuItem.setTitle("test");
        menuItems.add(menuItem);
         
        /*Проинициализуем наш адаптер*/
        MyAdapter myAdapter = new MyAdapter(this,R.layout.menu_item,menuItems);
 
       /*После этого добавим его в ListView*/
       mDrawerList.setAdapter(myAdapter);
 
 
     /**************/
Ну вот и все, будут вопросы, пишите.
sausagerus
226 / 3 / 0
Регистрация: 12.07.2014
Сообщений: 51
08.04.2016, 10:23  [ТС]     Добавление navigation drawer #4
Опачки, сейчас опробуем, затем отпишусь... что-то мне подсказывает , что вопросы будут)))
urayatsko
15 / 15 / 8
Регистрация: 08.04.2015
Сообщений: 36
08.04.2016, 10:50     Добавление navigation drawer #5
sausagerus, хорошо
sausagerus
226 / 3 / 0
Регистрация: 12.07.2014
Сообщений: 51
08.04.2016, 11:54  [ТС]     Добавление navigation drawer #6
urayatsko, а вот и вопросы(((
всё подошло, сделал, но когда вставляю последний код в активити , при инициализации класса МенюАйтем пишет, что класс MenuItem is abstract cannot be instantiated и не может найти метод setImageId() --- в то время как setTitle без проблем распознаёт...

и ниже с адаптором тоже трабл какой-то cannot resolve constructor
Error242, 31) error: no suitable constructor found for MyAdapter(Settings,int,List<android.view.MenuItem>)
constructor MyAdapter.MyAdapter(Context,int,List<de.magnum_gmbh.mw.MenuItem>) is not applicable
(actual argument List<android.view.MenuItem> cannot be converted to List<de.magnum_gmbh.mw.MenuItem> by method invocation conversion)
constructor MyAdapter.MyAdapter(Context,int,Context) is not applicable
(actual argument List<android.view.MenuItem> cannot be converted to Context by method invocation conversion)

Добавлено через 41 минуту
Разобрался из за чего траблы были)))
У меня класс MenuItem.class c MenuItem.View перепутались из за этого не работало ) теперь всё впорядке)
Спасибо большое urayatsko
urayatsko
15 / 15 / 8
Регистрация: 08.04.2015
Сообщений: 36
08.04.2016, 11:55     Добавление navigation drawer #7
sausagerus, рад был помочь.
sausagerus
226 / 3 / 0
Регистрация: 12.07.2014
Сообщений: 51
08.04.2016, 12:48  [ТС]     Добавление navigation drawer #8
что то я рано порадовался )))
Создал побольше мне нужных иконок и текстов и вот в этом месте
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
menuItem.setImageId(R.drawable.contacts);
        menuItem.setTitle("Addresses");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.articles);
        menuItem.setTitle("Articles");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.invoices);
        menuItem.setTitle("Invoices");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.orders);
        menuItem.setTitle("Orders");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.settings);
        menuItem.setTitle("Settings");
        menuItems.add(menuItem);
 
        //initialize your own adapter 
        mDrawerList.setAdapter(new MyAdapter(this, R.layout.drawer_list_item, menuItems));
рисуются 5 изображений и 5 текстов только последнего settings
то есть
pisettings settings
pisettings settings
pisettings settings
pisettings settings
pisettings settings

если же делаю menuItems.add(menuItem); только в конце, то отрисовывается только одна
urayatsko
15 / 15 / 8
Регистрация: 08.04.2015
Сообщений: 36
08.04.2016, 13:09     Добавление navigation drawer #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
menuItem.setImageId(R.drawable.contacts);
        menuItem.setTitle("Addresses");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.articles);
        menuItem.setTitle("Articles");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.invoices);
        menuItem.setTitle("Invoices");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.orders);
        menuItem.setTitle("Orders");
        menuItems.add(menuItem);
        menuItem.setImageId(R.drawable.settings);
        menuItem.setTitle("Settings");
        menuItems.add(menuItem);


вместо всего этого это попробуйте.

Java
1
2
3
4
5
6
7
8
9
10
 String[] titles = {"Addresses", "Articles", "Invoices","Orders","Settings"};
        Integer[] images = {R.drawable.contacts,R.drawable.articles,R.drawable.invoices,R.drawable.orders,R.drawable.settings};
        for(int i=0;i<5;i++){
            MenuItem menuItem = new MenuItem();
            menuItem.setTitle(titles[i]);
            menuItem.setImageId(images[i]);
            menuItems.add(menuItem);
}
        
mDrawerList.setAdapter(new MyAdapter(this, R.layout.drawer_list_item, menuItems));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 17:44     Добавление navigation drawer
Еще ссылки по теме:

Android Navigation drawer
Android Сдвинуть 3 палочки Navigation drawer
Android Navigation Drawer
Android Drawer Navigation and MenuItem
Смена activity в Navigation Drawer Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sausagerus
226 / 3 / 0
Регистрация: 12.07.2014
Сообщений: 51
21.06.2016, 17:44  [ТС]     Добавление navigation drawer #10
А это снова я)
Есть ли возможность допилить master/details flow?
... то есть существует приложение, и к нему нужно просто добавить вид для таблеток.
Есть ли где-то примеры, как это сделать?
Либо же прошу помощи)
Yandex
Объявления
21.06.2016, 17:44     Добавление navigation drawer
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru