Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
#1

Глобальная переменная в Java - Программирование Android

06.04.2016, 21:44. Просмотров 1253. Ответов 30
Метки нет (Все метки)

Подскажите нубу. Недавно начал изучать Java. У меня в методе onClick есть свич для обработки кнопок. Вот отрывок для одной кнопки:
Java
1
2
3
4
5
6
7
8
9
10
public void onClick(View v) {
        int res = 0;
        String vd = "";
        switch (v.getId()){
            case R.id.btn1:
                int zn = 1;
                res = res + zn;
                vd = vd + "1";
                viewText.setText(vd);
                break;
Как мне сделать, чтобы после выполнения свича, в строку String vd = ""; сохранялся полученный результат и при повторном выполнение свича использовался этот String vd = ""? Или что я не так понимаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 21:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Глобальная переменная в Java (Программирование Android):

SetOnClickListener исчезает глобальная переменная - Программирование Android
Помогите исчезает глобальная переменная //Здесь переменная выводится нормально Log.d(LOG_TAG, "Моя переменная"+tehGuid); ...

String-array resources, как глобальная переменная - Программирование Android
Требуется помощь! У меня есть 16 массивов <string-array>, в активити, когда я хочу обратится к ним, прописывать для каждого ...

Обмен данными между Activity (одна глобальная переменная) - Программирование Android
Добрый день, товарищи. Мой путь в андроиде только начинается, поэтому элементарные для Вас вещи кажутся непонятными для меня. Есть...

Глобальная переменная, которую можно использовать в других Activity - Программирование Android
Здравствуйте, интересует вопрос: как создать переменную, которую я смогу использовать в других классах, и после запуска я смогу к ней...

Глобальная обработке неперехваченных исключений - Программирование Android
Ну собственно как? Во-первых лень писать в каждом методе ко логирования, во-вторых, некрасиво, когда приложением падает с красноречивым...

Ошибка java.lang.ClassCastException: com.organizer.ToDoItemDescr cannot be cast to java.util.Map - Программирование Android
Ошибка появляется когда пытаюсь вытянуть из кастомного адаптера запись ListView. Весь лог ошибки такой: FATAL EXCEPTION: main Process:...

30
olegva11
9 / 9 / 1
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 22:23 #2
В Java нет глобальных переменных, по факту глобальная переменная, это переменная, которая будет в главном классе иерархии. Вам просто нужно
Java
1
String vd = "";
Вынести за пределы обработчика и объявить сразу под объявлением класса. Тогда получится переменная, которая имеет область на весь класс.
0
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 22:38  [ТС] #3
А можно пример? Нужно чтобы String vd = ""; менялась при каждом выполнении обработчика.

Добавлено через 2 минуты
Может нужно работать с this или super?
0
nikolay1982
121 / 121 / 44
Регистрация: 22.01.2014
Сообщений: 390
06.04.2016, 22:38 #4
Может вам так надо:
Java
1
2
3
4
5
6
            case R.id.btn1:
                int zn = 1;
                res = res + zn;
                vd = viewText.getText()+ "1";
                viewText.setText(vd);
                break;
1
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 22:41  [ТС] #5
Точно, то что нужно, спасибо большое!
0
olegva11
9 / 9 / 1
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 22:46 #6
Паша Ласточкин, Просто вместо того что бы запоминать, вы постоянно инициализируете переменную при каждом выполнении события и обнуляете её. Также у меня вопрос, вы хотите получить количество вызовов событий и записать их в viewText? Тогда зачем строковая переменная, можно сделать обычной целочисленной.
Что бы наглядно указать, нужно что бы вы кинули весь код.
0
nikolay1982
121 / 121 / 44
Регистрация: 22.01.2014
Сообщений: 390
06.04.2016, 22:47 #7
А может еще так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int id=v.getId();
int ids[]={
    R.id.btn0,R.id.btn1,R.id.btn2,R.id.btn3
    R.id.btn4,R.id.btn5,R.id.btn6,R.id.btn7
    R.id.btn8,R.id.btn9
};
int cur_num=-1;
for (int i=0;i<ids.length;i++){
    if (ids[i]==id) {
    cur_num=i;
    break;
    }
}
if (cur_num>=0){
    String vd=viewText.getText()+ cur_num;
    viewText.setText(vd);
}
0
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 22:58  [ТС] #8
Я хочу сделать калькулятор. Мне нужно чтобы при нажатии например кнопки 1 - 2 раза отображалось 11 в тексвью, а не 1(уже объяснили). А в res нужно чтобы заносилась полученная информация и при повторном выполнении онклик я мог работать с предыдущим res, а не int res = 0;
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
package com.example.pasha.calc;
 
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, c, op1, op2, op3, rav;
 
    TextView textView;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        btn4 = (Button) findViewById(R.id.btn4);
        btn5 = (Button) findViewById(R.id.btn5);
        btn6 = (Button) findViewById(R.id.btn6);
        btn7 = (Button) findViewById(R.id.btn7);
        btn8 = (Button) findViewById(R.id.btn8);
        btn9 = (Button) findViewById(R.id.btn9);
        c = (Button) findViewById(R.id.c);
        op1 = (Button) findViewById(R.id.op1);
        op2 = (Button) findViewById(R.id.op2);
        rav = (Button) findViewById(R.id.rav);
        textView = (TextView) findViewById(R.id.textView);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
        btn9.setOnClickListener(this);
 
 
 
 
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
 
    @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
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
 
    @Override
    public void onClick(View v) {
        int res = 0;
        String vd = "";
        switch (v.getId()){
            case R.id.btn1:
                int zn = 1;
                res = res + zn;
                int vres = res;
                vd = vd + "1";
                editText.setText(vd);
                break;
            case R.id.btn2:
                zn = 2;
                res = res + zn;
                vd = editText.getText()+ "2";
                editText.setText(vd);
                break;
           
        }
    }
}
0
nikolay1982
121 / 121 / 44
Регистрация: 22.01.2014
Сообщений: 390
06.04.2016, 23:04 #9
Вы исправили только "case R.id.btn2", в "case R.id.btn1" остается ошибка. Второй мой код смотрели?
0
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 23:07  [ТС] #10
Мне пока хватит одного кейса для проверки, потом я к остальным добавлю. Второй код я не совсем понял, что он выполняет?
0
olegva11
9 / 9 / 1
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 23:11 #11
Паша Ласточкин, Если правильно понял, просто вынес переменную вне вашего обработчика, может что-то не так понял.

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
package com.example.pasha.calc;
 
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, c, op1, op2, op3, rav;
 
    TextView textView;
     int res = 0; //Ваша переменная, первоначально будет 0
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        btn4 = (Button) findViewById(R.id.btn4);
        btn5 = (Button) findViewById(R.id.btn5);
        btn6 = (Button) findViewById(R.id.btn6);
        btn7 = (Button) findViewById(R.id.btn7);
        btn8 = (Button) findViewById(R.id.btn8);
        btn9 = (Button) findViewById(R.id.btn9);
        c = (Button) findViewById(R.id.c);
        op1 = (Button) findViewById(R.id.op1);
        op2 = (Button) findViewById(R.id.op2);
        rav = (Button) findViewById(R.id.rav);
        textView = (TextView) findViewById(R.id.textView);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
        btn9.setOnClickListener(this);
 
 
 
 
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
 
    @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
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
 
    @Override
    public void onClick(View v) {
     //   int res = 0; При каждом вызове обнуляется, вариант либо записывать в какой-то компонент(на формочке, либо вынести объявление переменной выше)
        String vd = "";
        switch (v.getId()){
            case R.id.btn1:
                int zn = 1;
                res = res + zn;
                int vres = res;
                vd = vd + "1";
                editText.setText(vd);
                break;
            case R.id.btn2:
                zn = 2;
                res = res + zn;
                vd = editText.getText()+ "2";
                editText.setText(vd);
                break;
           
        }
    }
}
1
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 23:17  [ТС] #12
Видимо я не так объяснял или не сразу понял. Теперь разобрался. Получается, что метод изначально работает с переменными общего класса, а потом, когда появляются локальные, с локальными?
0
olegva11
9 / 9 / 1
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 23:20 #13
Паша Ласточкин, Метод имеет доступ к переменным общего класса, а так же имеет доступ к своим локальным переменным, но везде рекомендуют использовать переменные именно локальные, потому что не будет возникать проблема с добавлением(расширяемость класса) методов в класс и тд, но это в больших проектах.
Так же нужно создавать универсальный код, если он делает тоже самое, то нужно стремится к тому, что бы этим занимался именно один метод. Как вам советует nikolay1982.
1
nikolay1982
121 / 121 / 44
Регистрация: 22.01.2014
Сообщений: 390
06.04.2016, 23:20 #14
Подбирает индекс кнопки по id источника события. Индекс 0 соответствует кнопки 0, и т.д.
Далее берется строка из viewText(вы поменяли его на editText) и к этой строке дописывается в конец строковое представление индекс кнопки(button).
Потом обновляется viewText полученным строковым значения(на экране).

Можно и case-ми.
Но вы сами только что допустили ошибку. А мой код более выразителен. И не надо 10 раз Copy->Past.
если хотите case-ми тогда:
1
Паша Ласточкин
0 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 21
06.04.2016, 23:30  [ТС] #15
nikolay1982, Ваш способ действительно лучше по объему кода, просто мне понятнее кейсы, в циклах я пока не очень разбираюсь.
0
06.04.2016, 23:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2016, 23:30
Привет! Вот еще темы с ответами:

Не создаются BuildConfig.java R.java - Программирование Android
BuildConfig.java , R.java Не создаются в папке /gen при создании проекта в eclipse. Переустанавливал программу, ничего не помогает. Что...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Глобальная переменная - PHP
Здраствуйте, вот интересует такой вопрос: можно ли как-то переменную сделать глобальной так, чтобы её можно было использовать у разных...

Глобальная переменная - Flash
Доброе время суток. Я новичок во Flash:-[. Мне нужна глобальная переменная. В хелпе написано как ее создать, но только внутри класса. Но...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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