Страница 1 из 1

Как обратиться к Activity из вновь созданного класа?

Добавлено: 16 сен 2014, 12:00
grem17
создаю новый класс без наследования, хочу в нем сделать вывод сообщения на экран

создаю процедуру

Код: Выделить всё

	protected void Mess (Context c){
		Toast.makeText(c, "text", Toast.LENGTH_SHORT).show();
	}
в основном модуле вешаю обработчик события на кнопку и хочу вызвать процедуру из нового класса, передав туда параметром Activity

Код: Выделить всё

		Button btn_add = (Button) findViewById(R.id.btn_add);
		btn_add.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Message.Mess(getApplicationContext());
			}
как обратиться к основному Activity из вновь созданного класса?

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 16 сен 2014, 15:00
anber
1) protected void Mess (Context c) - Mess это название метода и должно начинаться с маленькой буквы
2) раз нужно обратиться к Activity так и передавай Activity а не Context.
3) ЗАЧЕМ понадобилось обращаться к Activity в постороннем классе??? Что-то мне подсказывает что вы задумали что-то плохое.

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 16 сен 2014, 17:02
grem17
то что вам подсказывает - явно ошибается
у меня знаний не хватит на что то плохое и желания это делать нет

все проще, хочу научиться создавать классы и вызывать функции из них
для себя решил разобраться и создать класс с единственной процедурой выполняющей вывод сообщения на экран, как это сделать?
класс создал, функцию создал, если бы выводил сообщение из основного класса MainActivity то было бы так

Toast.makeText(this, "text", Toast.LENGTH_SHORT).show();

а как вывести сообщение на экран из нового класса?

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 16 сен 2014, 17:47
anber
Под что-то плохое я имел в виду что передача Activity в другой класс чревата багами, проблемой с архитектурой и прочей головной болью разработчика.

>>>все проще, хочу научиться создавать классы и вызывать функции из них
Зачем тогда лезть в андроид? Изучай чистую джаву, будет меньше проблем, потом перейдешь к андроиду.

>>>создать класс с единственной процедурой выполняющей вывод сообщения на экран, как это сделать?
сам же писал
>>>Toast.makeText(c, "text", Toast.LENGTH_SHORT).show();

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 17 сен 2014, 09:56
grem17
возможно я непонятно объяснил чего хочу, попробую иначе...
создал новый проект, в основном классе добавил единственную строку - вывод сообщени на экран

Код: Выделить всё

package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Toast.makeText(getApplication(), "test", Toast.LENGTH_SHORT).show();}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

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

Код: Выделить всё

package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {
	private NewClass NewClass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		NewClass.NewFunction();
        }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
новый класс к которому идет обращение

Код: Выделить всё

package com.example.test;
import android.widget.Toast;

public class NewClass{	
	public void NewFunction() {
		Toast.makeText(null, "test", Toast.LENGTH_SHORT).show();
	}
}

инетерсует вот эта строка
Toast.makeText(null, "test", Toast.LENGTH_SHORT).show();
что должно быть вместо null?
возможно при вызове функции надо ссылку на Activity или Context передавать как параметр?

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 17 сен 2014, 10:33
anber
создаю процедуру

protected void Mess (Context c){
Toast.makeText(c, "text", Toast.LENGTH_SHORT).show();
}
Ты писал это в первом сообщении - ты передаешь Context как параметр. Вызываешь его Message.Mess(getApplicationContext()); Тут точно также.

>>>что должно быть вместо null?
Если брать пример выше то c.

Вместо NewClass.NewFunction(); - NewClass.NewFunction(getApplicationContext());
Только пиши названия функций с маленькой буквы. Не NewClass.NewFunction(); а NewClass.newFunction();

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 17 сен 2014, 11:18
grem17
блин, но не работает же...

Код: Выделить всё

package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {
	private NewClass NewClass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		NewClass.newFunction(getApplicationContext());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

Код: Выделить всё

package com.example.test;
import android.content.Context;
import android.widget.Toast;

public class NewClass {	
	public void newFunction(Context c) {
		Toast.makeText(c, "test", Toast.LENGTH_SHORT).show();
	}
}



выдает ошибку
ScreenShot 6.jpg
ScreenShot 6.jpg (144.79 КБ) 12346 просмотров

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 17 сен 2014, 12:58
anber
У меня работает.
В LogCat что?

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 05:16
grem17
ScreenShot 7.jpg
ScreenShot 7.jpg (568.27 КБ) 12337 просмотров
ScreenShot 8.jpg
ScreenShot 8.jpg (396.68 КБ) 12337 просмотров

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 07:40
klblk
1) Оформляйте код на форуме читабельно!
2) [syntax=java]private NewClass NewClass;[/syntax]
Имена переменных также как и имена функций должны быть с маленькой буквы.
3) [syntax=java]NewClass.newFunction(getApplicationContext());[/syntax]
NPE

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 08:00
grem17
отредактировал код по правилам
так как насчет моего вопроса?

если бы я делал это через delphi то обращение к элементам формы из любого модуля выглядело бы так Form1.Label1.Text:="бла-бла-бла";

в java активность аналогична форме в делфи, но здесь свой синтаксис, нельзя сказать
Activity1.Toast.makeText(.......).show();

вопрос - а как можно?

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 09:05
grem17
все, сам разобрался =)

код основного модуля

Код: Выделить всё

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
        
		NewClass NewClass = new NewClass();
		NewClass.newFunction(getApplication());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
		

}
код доп. модуля

Код: Выделить всё

package com.example.test;

import android.content.Context;
import android.widget.Toast;


public class NewClass {	
	public void newFunction(Context c) {		
		Toast.makeText(c, "test", Toast.LENGTH_SHORT).show();
	}

}
вся проблема была в неправильном объявлении и вызове доп.класса, должно быть вот так
NewClass NewClass = new NewClass();
NewClass.newFunction(getApplication());


всем спасибо, форум понравился - живой, я у вас тут поселюсь надолго, вопросов куча

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 10:02
klblk
grem17 писал(а):вся проблема была в неправильном объявлении и вызове доп.класса, должно быть вот так
NewClass NewClass = new NewClass();
NewClass.newFunction(getApplication());


всем спасибо, форум понравился - живой, я у вас тут поселюсь надолго, вопросов куча
ну я же написал NPE =)

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 10:35
anber
klblk писал(а): ну я же написал NPE =)
BTW, AFAIK NPE LGTM, BRB

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 15:46
KamiSempai
grem17 писал(а):вся проблема была в неправильном объявлении и вызове доп.класса, должно быть вот так
NewClass NewClass = new NewClass();
NewClass.newFunction(getApplication());


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

PS:Мой список каверзных вопросов по Java пополнился еще одним :twisted:

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 15:56
Mikhail_dev
надо сделать FAQ, куда добавить "Java Code Convention" как библию

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 16:13
anber
Mikhail_dev писал(а):надо сделать FAQ, куда добавить "Java Code Convention" как библию
FAQ все равно никто не читает. Особенно те кто эту самую Code Convention не соблюдает.
PS:Мой список каверзных вопросов по Java пополнился еще одним
У меня вчера спросили, почему не компилится:
String s = "test\u005C";
System.out.println(s);

для разнообразия можно в Intellij Idea вбить String s = "test\u005C\"; и посмотреть на ее реакцию :)

Re: Как обратиться к Activity из вновь созданного класа?

Добавлено: 18 сен 2014, 16:21
Mikhail_dev
У меня вчера спросили, почему не компилится:
String s = "test\u005C";
System.out.println(s);
ну экранирование еще ладно, не все его понимают.