#java #android #static
#java #Android #статический
Вопрос:
У меня возникают огромные трудности со статическими членами при попытке создать приложение для Android.
Вот что должно делать приложение:
Есть две вкладки: Мои классы и Список классов, каждая из которых представляет собой отдельные намерения. Суть приложения в том, что когда вы нажимаете кнопку «добавить» рядом с классом в списке классов, он должен динамически обновлять список в разделе «Мои классы». Однако я не могу этого сделать, потому что моя структура данных, содержащая классы, является динамической, но намерение списка классов статично, поэтому я продолжаю получать ошибку «Невозможно ссылаться на нестатический элемент из статического контекста».
Есть ли какой-либо способ использовать динамические намерения, и если да, то как?
Редактировать:
Здесь объявляются намерения:
public class TabLayout extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
Intent intent = new Intent(this, MyClasses.class);
tabHost.addTab(tabHost.newTabSpec("My Classes")
.setIndicator("My Classes", res.getDrawable(R.drawable.ic_tab_main))
.setContent(intent));
Intent intent2 = new Intent(this, ClassList.class);
tabHost.addTab(tabHost
.newTabSpec("Class List")
.setIndicator("Class List", res.getDrawable(R.drawable.ic_tab_main))
.setContent(intent2));
Intent intent3 = new Intent(this, SyncList.class);
tabHost.addTab(tabHost
.newTabSpec("Sync List")
.setIndicator("Sync List", res.getDrawable(R.drawable.ic_tab_main))
.setContent(intent3));
tabHost.setCurrentTab(0);
// Set tabs Colors
tabHost.setBackgroundColor(Color.BLACK);
tabHost.getTabWidget().setBackgroundColor(Color.BLACK);
}
}
Вот файл MyClassList:
открытый класс MyClassList расширяет MyClasses {
int numClasses;
MyClasses myclasses = new MyClasses();
final static TableRow tableRowArray[] = new TableRow[4];
TextView classNameArray[] = new TextView[4];
TextView teacherNameArray[] = new TextView[4];
Button dropButtonArray[] = new Button[4];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create containers
ScrollView classListScrollView = new ScrollView(this);
TableLayout classListTableLayout = new TableLayout(this);
// Add class entries
for (int i = 0; i < 4; i )
{
tableRowArray[i] = new TableRow(this);
tableRowArray[i].setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
classNameArray[i] = new TextView(this);
classNameArray[i].setText("");
classNameArray[i].setPadding(10, 20, 10, 20);
classNameArray[i].setTextSize(20);
tableRowArray[i].addView(classNameArray[i]);
teacherNameArray[i] = new TextView(this);
teacherNameArray[i].setText("");
teacherNameArray[i].setPadding(10, 20, 10, 20);
teacherNameArray[i].setTextSize(16);
tableRowArray[i].addView(teacherNameArray[i]);
dropButtonArray[i] = new Button(this);
dropButtonArray[i].setText("Drop");
tableRowArray[i].addView(dropButtonArray[i]);
classListTableLayout.addView(tableRowArray[i], new TableLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
tableRowArray[i].setVisibility(View.GONE);
}
classListScrollView.addView(classListTableLayout);
this.setContentView(classListScrollView);
dropButtonArray[0].setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
myclasses.dropClass(0);
}
});
dropButtonArray[1].setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
myclasses.dropClass(1);
}
});
dropButtonArray[2].setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
myclasses.dropClass(2);
}
});
dropButtonArray[3].setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
myclasses.dropClass(3);
}
});
}
public void updateMyClasses(ClassObject myclasses[])
{
for (int i = 0; i < 4; i )
{
if (myclasses[i].isNull)
{
classNameArray[i].setText(myclasses[i].getClassName());
teacherNameArray[i].setText(myclasses[i].getTeacherName());
tableRowArray[i].setVisibility(View.VISIBLE);
}
else
{
tableRowArray[i].setVisibility(View.GONE);
}
}
}
public MyClasses getMyClasses()
{
return myclasses;
}
}
Вот файл MyClasses:
открытый класс MyClasses расширяет активность {
static int numClasses;
static ClassObject MyClassArray[];
public MyClasses()
{
MyClassArray = new ClassObject[4];
for (int i = 0; i < 4; i )
{
MyClassArray[i] = new ClassObject();
}
numClasses = 0;
}
public int getNumClasses()
{
return numClasses;
}
public void dropClass(int c)
{
for (int i = c; i < 3; i )
{
MyClassArray[i] = MyClassArray[i 1];
}
//MyClassList.updateMyClasses(MyClassArray);
}
public void addClass(ClassObject c)
{
if (numClasses >= 4)
return;
MyClassArray[numClasses] = c;
//MyClassList.updateMyClasses(MyClassArray);
}
public boolean hasClass(ClassObject c)
{
for (int i = 0; i < 4; i )
{
if (MyClassArray[i].getClassName() == c.getClassName())
return true;
}
return false;
}
}
И вот строка, которая выдает ошибку:
addButtonArray[0].setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
MyClasses.addClass(ClassListArray[0]);
}
});
Комментарии:
1. Почему бы просто не создавать intent при каждом нажатии кнопки и не удалять ключевое слово static перед глобальной переменной Intent .
2. Пожалуйста, вставьте сюда ту часть кода, которая вызывает у вас проблемы
Ответ №1:
Эта строка — ваша проблема:
MyClasses.addClass(ClassListArray[0]);
Вы пытаетесь вызвать метод экземпляра addClass
без указания ссылки на MyClasses
экземпляр. Как это исправить, зависит от того, где находится код. Встроено ли оно в MyClasses
класс?
Комментарии:
1. Я только что добавил код для MyClassList. По сути, я пытался отделить элементы графического интерфейса от фактической структуры данных MyClasses, но у меня все еще возникает проблема с попыткой ссылаться на нестатический элемент (т. Е. Структуру данных MyClasses) из статического контекста (т. Е. Экземпляр classList ).)