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

Custom Menu - Android

Восстановить пароль Регистрация
 
Chernoff20
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 28
21.06.2013, 01:10     Custom Menu #1
Здравствуйте. Пробую по примеру сделать своё меню, вот коды
Главная активити
Кликните здесь для просмотра всего текста
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
package com.authorwjf;
 
import java.util.ArrayList;
import com.authorwjf.CustomMenu.OnMenuItemSelectedListener;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.widget.Toast;
 
public class Demo extends Activity implements OnMenuItemSelectedListener {
    
    private CustomMenu mMenu;
    public static final int MENU_ITEM_1 = 1;
    public static final int MENU_ITEM_2 = 2;
    public static final int MENU_ITEM_3 = 3;
    public static final int MENU_ITEM_4 = 4;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mMenu = new CustomMenu(this, this, getLayoutInflater());
        mMenu.setHideOnSelect(true);
        mMenu.setItemsPerLineInPortraitOrientation(4);
        mMenu.setItemsPerLineInLandscapeOrientation(4);
 
        loadMenuItems();
    }
 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            doMenu();
            return true; //always eat it!
        }
        return super.onKeyDown(keyCode, event); 
    } 
    
    private void loadMenuItems() {
 
        ArrayList<CustomMenuItem> menuItems = new ArrayList<CustomMenuItem>();
        CustomMenuItem cmi = new CustomMenuItem();
        cmi.setCaption("Item 1");
        cmi.setId(MENU_ITEM_1);
        menuItems.add(cmi);
        cmi = new CustomMenuItem();
        cmi.setCaption("Item 2");
        cmi.setId(MENU_ITEM_2);
        menuItems.add(cmi);
        cmi = new CustomMenuItem();
        cmi.setCaption("Item 3");
        cmi.setId(MENU_ITEM_3);
        menuItems.add(cmi);
        cmi = new CustomMenuItem();
        cmi.setCaption("Item 4");
        cmi.setId(MENU_ITEM_4);
        menuItems.add(cmi);
        if (!mMenu.isShowing())
        try {
            mMenu.setMenuItems(menuItems);
        } catch (Exception e) {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("Egads!");
            alert.setMessage(e.getMessage());
            alert.show();
        }
    }
 
    private void doMenu() {
        if (mMenu.isShowing()) {
            mMenu.hide();
        } else {
            mMenu.show(findViewById(R.id.any_old_widget));
        }
    }
 
    @Override
    public void MenuItemSelectedEvent(CustomMenuItem selection) {
        Toast t = Toast.makeText(this, "You selected item #"+Integer.toString(selection.getId()), Toast.LENGTH_SHORT);
        t.setGravity(Gravity.CENTER, 0, 0);
        t.show();
    }
}

Активити с пунктами меню
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.authorwjf;
 
public class CustomMenuItem {
 
    private String mCaption = null;
    private int mImageResourceId = -1;
    private int mId = -1;
    
    public void setCaption(String caption) { mCaption =caption; }
 
    public String getCaption() { return mCaption; }
 
    public void setImageResourceId(int imageResourceId) { mImageResourceId = imageResourceId; }
 
    public int getImageResourceId() { return mImageResourceId;  }
 
    public void setId(int id) { mId = id; }
 
    public int getId() { return mId; }
    
}

Активити с самим меню
Кликните здесь для просмотра всего текста
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
package com.authorwjf;
 
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
 
public class CustomMenu {
 
    private ArrayList<CustomMenuItem> mMenuItems;
    private OnMenuItemSelectedListener mListener = null;
    private Context mContext = null;
    private LayoutInflater mLayoutInflater = null;
    private PopupWindow mPopupWindow = null;
    private boolean mIsShowing = false;
    private boolean mHideOnSelect = true;
    private int mRows = 0;
    private int mItemsPerLineInPortraitOrientation = 3;
    private int mItemsPerLineInLandscapeOrientation = 6;
    
    public interface OnMenuItemSelectedListener {
        public void MenuItemSelectedEvent(CustomMenuItem selection);
    }
 
    public boolean isShowing() { return mIsShowing; }
 
    public void setHideOnSelect(boolean doHideOnSelect) { mHideOnSelect = doHideOnSelect; } 
 
    public void setItemsPerLineInPortraitOrientation(int count) { mItemsPerLineInPortraitOrientation = count; }
 
    public void setItemsPerLineInLandscapeOrientation(int count) { mItemsPerLineInLandscapeOrientation = count; }
 
    public synchronized void setMenuItems(ArrayList<CustomMenuItem> items) throws Exception {
        if (mIsShowing) {
            throw new Exception("Menu list may not be modified while menu is displayed.");
        }
        mMenuItems = items;
    }
 
    public CustomMenu(Context context, OnMenuItemSelectedListener listener, LayoutInflater lo) {
        mListener = listener;
        mMenuItems = new ArrayList<CustomMenuItem>();
        mContext = context;
        mLayoutInflater = lo;
    }
 
    public synchronized void show(View v) {
        mIsShowing = true;
        boolean isLandscape = false;
        int itemCount = 4;
        if (itemCount<1) return; //нет пунктов меню для показа
        if (mPopupWindow != null) return; //всегда показывает
        Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        if (display.getWidth() > display.getHeight()) isLandscape = true;
        View mView= mLayoutInflater.inflate(R.layout.custom_menu, null);
        mPopupWindow = new PopupWindow(mView,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT, false);
        mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
        mPopupWindow.setWidth(LayoutParams.WRAP_CONTENT);
        mPopupWindow.showAtLocation(v, Gravity.BOTTOM|Gravity.RIGHT, 0, 0);
        /*
        int divisor = mItemsPerLineInPortraitOrientation;
        if (isLandscape) divisor = mItemsPerLineInLandscapeOrientation;
        int remainder = 0;
        if (4 < divisor) {
            mRows = 1;
            remainder = 4;
        } else {
            mRows = (4 / divisor);
            remainder = 4 % divisor;
            if (remainder != 0) mRows++;
        }
        */
        TableLayout table = (TableLayout)mView.findViewById(R.id.custom_menu_table);
        table.removeAllViews();
        for (int i=0; i < 4; i++) {
            TableRow row = null;
            TextView tv = null;
            row = new TableRow(mContext);
            row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
            
            for (int j=0; j< 4; j++) {
                if (i*4+j >= 4) break;
                final CustomMenuItem cmi = mMenuItems.get(i*4+j);
                View itemLayout = mLayoutInflater.inflate(R.layout.custom_menu_item, null);
                tv = (TextView)itemLayout.findViewById(R.id.custom_menu_item_caption);
                tv.setText(cmi.getCaption());
                itemLayout.setOnClickListener( new OnClickListener() {
                   @Override
                   public void onClick(View v) {
                        mListener.MenuItemSelectedEvent(cmi);
                        if (mHideOnSelect) hide();
                   }
                });
                row.addView(itemLayout);
            }           
            table.addView(row);
       }     
    }
 
    public synchronized void hide() {
        mIsShowing = false;
        if (mPopupWindow != null) {
            mPopupWindow.dismiss();
            mPopupWindow = null;
        }
        return;
    }
}

Разметка пункта меню
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:clickable="true"
    android:gravity="center"
    android:orientation="horizontal"
    android:padding="4dip" >    
 
    <TextView
        android:id="@+id/custom_menu_item_caption"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textSize="12sp" />
 
</LinearLayout>

Разметка всего меню
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >
 
    <TableLayout
        android:id="@+id/custom_menu_table"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:stretchColumns="*" >
 
    </TableLayout>
 
</LinearLayout>


В общем сейчас это меню представляет собой разметку в виде одной строки и четырех столбцов, они я так понимаю создаются динамически, так вот мой вопрос в том, как сделать, чтобы был один столбец, а строк 4 ? Чтоб это меню стало похоже на меню из старших версий.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2013, 01:10     Custom Menu
Посмотрите здесь:

Gallery and custom view Android
Смена бэкграунда в custom диалоге Android
TabHost, ListView и custom Adapter Android
Custom AlertDialog Android
SQLite, custom ContentProvider and Loader Android
Custom ExpandableListView перемешиваются группы Android
Реализация custom GridView Android
Custom ListView item setColor Android
Custom Camera. Растянутое изображение Android
Android PreferenceFragment custom dialog
Custom Log Android
Custom Fonts in widget Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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