В приложении на Android когда в фрагменте
JournalFragment
вызываешь контекстное меню у ListView
lvJournal
и выбераешь пункт Return преложение вызывает метод из фрагмента CompliteFragment
в контекстном меню ListView
lvComplite
. Из-за чего так может происходить?
Код фрагмента с нужным меню:
public class JournalFragment extends Fragment {
private ListView lvJournal;
private SimpleCursorAdapter scAdapter;
private static final int CM_RETURN_ID = 1;
private Cursor Jcursor;
private DBController dbController;
private UIController uiController;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_journal, container, false);
lvJournal = (ListView) v.findViewById(R.id.lvJournal);
dbController = new DBController();
uiController = new UIController();
Jcursor = dbController.getAllData(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbJournal());
Jcursor.moveToFirst();
uiController.crListView(lvJournal, getActivity(), R.layout.db_item, Jcursor, getResources().getString(R.string.TactID), getResources().getString(R.string.NameObjective), R.id.tvTID, R.id.tvName);
Jcursor.requery();
registerForContextMenu(lvJournal);
return v;
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CM_RETURN_ID, 0, getResources().getString(R.string.return_str));
}
//контекстное меню для списа
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == CM_RETURN_ID) {
// Получает индифкатор элемента
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
//Добавляем елемнт в БД с заданиями в 1 табе
// dbController.GenObjectiveMain(Jcursor,AppContext.getDbAdapterMain().getmDB());
dbController.addRecT(AppContext.getDbAdapterMain().getmDB(),Jcursor.getInt(Jcursor.getColumnIndex(getResources().getString(R.string._id))),
Jcursor.getString(Jcursor.getColumnIndex(getResources().getString(R.string.NameObjective))),
Jcursor.getString(Jcursor.getColumnIndex(getResources().getString(R.string.Discription))),
Jcursor.getInt(Jcursor.getColumnIndex(getResources().getString(R.string.TactID))));
// Обновление курсора
Jcursor.requery();
return true;
}
return super.onContextItemSelected(item);
}
}
Код фрагмента, метод которого вызывается вместо нужного:
public class CompliteFragment extends Fragment {
private ListView lvComplite;
private SimpleCursorAdapter scAdapter;
private static final int CM_RETURN_ID = 1;
private static Cursor Ccursor;
private DBController dbController;
private UIController uiController;
public static Cursor getCcursor() {
return Ccursor;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_complite, container, false);
lvComplite = (ListView) v.findViewById(R.id.lvComplite);
dbController = new DBController();
uiController = new UIController();
Ccursor = dbController.getAllData(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbComp());
Ccursor.moveToFirst();
uiController.crListView(lvComplite, getActivity(), R.layout.db_item, Ccursor, getResources().getString(R.string.TactID), getResources().getString(R.string.NameObjective), R.id.tvTID, R.id.tvName);
Ccursor.requery();
registerForContextMenu(lvComplite);
lvComplite.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick( AdapterView<?> parent, View view ,
int position, long id ) {
uiController.createInfoDialog(getActivity(), Ccursor,
getResources().getString(R.string.dis_string),
getResources().getString(R.string.Discription),
getResources().getString(R.string.ok_string));
}
} );
return v;
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CM_RETURN_ID, 0, getResources().getString(R.string.return_str));
}
//контекстное меню для списа
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == CM_RETURN_ID) {
// Получает индифкатор элемента
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
dbController.GenirateObjective(Ccursor,AppContext.getDbAdapterMain().getmDB());
// удоляет эту позицию по id
dbController.delRec(AppContext.getDbAdapterMain().getmDB(),
AppContext.getDbAdapterMain().getDbComp(),
AppContext.getDbAdapterMain().getColumnId(),
acmi.id);
// Обновление курсора
Ccursor.requery();
return true;
}
return super.onContextItemSelected(item);
}
}
Класс с методами:
public class DBController implements CrudComand {
@Override
public Cursor getAllData(SQLiteDatabase mDB, String tableName) {
return mDB.query(tableName, null, null, null, null, null, null);
}
@Override
public void delRec(SQLiteDatabase mDB, String tableName, String columName, long id) {
mDB.delete(tableName, columName + " = " + id, null);
}
@Override
public void delRec(SQLiteDatabase mDB, String tableName, String columName) {
mDB.delete(tableName, columName, null);
}
@Override
public ContentValues addRec(int id, String name, String discription, int oid) {
ContentValues cv = new ContentValues();
cv.put(AppContext.getDbAdapterMain().getColumnId(), id);
cv.put(AppContext.getDbAdapterMain().getColumnName(), name);
cv.put(AppContext.getDbAdapterMain().getColumnDs(), discription);
cv.put(AppContext.getDbAdapterMain().getColumnTid(), oid);
return cv;
}
@Override
public void addRecTJ(SQLiteDatabase mDB,int id, String name, String discription, int oid) {
mDB.insert(AppContext.getDbAdapterMain().getDbTable(), null, addRec(id, name, discription, oid));
mDB.insert(AppContext.getDbAdapterMain().getDbJournal(), null, addRec(id, name, discription, oid));
}
@Override
public void addRecT(SQLiteDatabase mDB,int id, String name, String discription, int oid) {
mDB.insert(AppContext.getDbAdapterMain().getDbTable(), null, addRec(id, name, discription, oid));
}
@Override
public void addRecToComplite(SQLiteDatabase mDB,int id, String name, String discription, int oid, Cursor cursor) {
mDB.insert(AppContext.getDbAdapterMain().getDbComp(), null, addRec(id, name, discription, oid));
cursor.requery();
}
public void GenirateObjective(Cursor cursor,SQLiteDatabase mDB) {
addRecTJ(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getString(cursor.getColumnIndex("NameObjective")),
cursor.getString(cursor.getColumnIndex("Discription")),
cursor.getInt(cursor.getColumnIndex("TactID")));
cursor.requery();
}
public Cursor GenObjectiveToComplite(Cursor cursor,SQLiteDatabase mDB, Cursor anotherCursor)
{
// String tid = getResources().getString(R.string.TactID);
addRecToComplite(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getString(cursor.getColumnIndex("NameObjective")),
cursor.getString(cursor.getColumnIndex("Discription")),
cursor.getInt(cursor.getColumnIndex("TactID")) , cursor );
anotherCursor.requery();
return cursor;
}
public void GenObjectiveMain(Cursor cursor,SQLiteDatabase mDB)
{
// String tid = getResources().getString(R.string.TactID);
addRecT(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getString(cursor.getColumnIndex("NameObjective")),
cursor.getString(cursor.getColumnIndex("Discription")),
cursor.getInt(cursor.getColumnIndex("TactID")));
cursor.requery();
}
public void genirator(int Res, Cursor cursor, List<Integer> List, TextView tvObjective) {
//перемещаем курсор на 1 место в таблице
cursor.moveToFirst();
//пробигаемся по счётчику
for(int i = 0; i<List.size(); i++)
{
//Если совпадений нет
if ( !List.contains(Res))
{
List.add(Res);//добавляем номер в счётчик
cursor.moveToFirst();
cursor.moveToPosition(Res);//переходим на позицию случайного числа
//присваиваем значение из БД полям на Активити
String sID = cursor.getString(cursor.getColumnIndex("TactID"));
String sName = cursor.getString(cursor.getColumnIndex("NameObjective"));
String sDiscription = cursor.getString(cursor.getColumnIndex("Discription"));
//добавляем задание
GenirateObjective(cursor, AppContext.getDbAdapterMain().getmDB());
tvObjective.setText(sID +" : "+sName);
}
}
}
public void buttonGenirate(Cursor Acursor, List<Integer> ObjectivList, TextView tvObjective)
{
Random random = new Random();
int Res = random.nextInt(37);//получаем случайное число
//ищем было ли уже такое задание
for(int i = 0; i < ObjectivList.size(); i++ )
{
if(ObjectivList.contains(Res))//если да
{
Res = random.nextInt(36);// создаём по новой
}
}
//добавляем в список задание
genirator(Res, Acursor,ObjectivList, tvObjective);
Collections.sort(ObjectivList);
for(int i = 0; i<ObjectivList.size(); i++)
{
Log.d("tag", "" + ObjectivList.get(i));
}
}
public void genirator(int Res, Cursor cursor, List<Integer> List)
{
//перемещаем курсор на 1 место в таблице
cursor.moveToFirst();
//пробигаемся по счётчику
for(int i = 0; i<List.size(); i++)
{
//Если совпадений нет
if ( !List.contains(Res))
{
List.add(Res);//добавляем номер в счётчик
cursor.moveToFirst();
cursor.moveToPosition(Res);//переходим на позицию случайного числа
//присваиваем значение из БД полям на Активити
GenirateObjective(cursor, AppContext.getDbAdapterMain().getmDB());
// tvObjective.setText(sID +" : "+sName);
}
}
}
//Функция стирания
public void discard(AssigmentFragment assigmentFragment)
{
delRec(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbTable(), AppContext.getDbAdapterMain().getColumnId());
//стирает пока есть элементы в счётчике
for(int i = assigmentFragment.getObjectivList().size(); i >= 0; i--)
{
delRec(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbJournal(), AppContext.getDbAdapterMain().getColumnId());
delRec(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbComp(), AppContext.getDbAdapterMain().getColumnId());
}
//Чистит счётчик
for(int i = assigmentFragment.getObjectivList().size()-1; i>=0; i--)
{
assigmentFragment.getObjectivList().remove(i);
}
assigmentFragment.getObjectivList().add(100);
assigmentFragment.getMainCursor().requery
();
//Устонавливаем начальные значения
// assigmentFragment.rec();
//Показывает начальный диалог
//createStartDialog();
}
}
Ошибка лога
08-10 12:55:39.647 6258-6258/ru.itsmygame.tacticalgenirator E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.itsmygame.tacticalgenirator, PID: 6258
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
at ru.itsmygame.tacticalgenirator.controller.DBController.GenirateObjective(DBController.java:75)
at ru.itsmygame.tacticalgenirator.view.CompliteFragment.onContextItemSelected(CompliteFragment.java:85)
at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:2332)
at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:3070)
at android.support.v4.app.FragmentController.dispatchContextItemSelected(FragmentController.java:366)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:417)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4822)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:172)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1020)
at android.widget.AdapterView.performItemClick(AdapterView.java:300)
at android.widget.AbsListView.performItemClick(AbsListView.java:1163)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3125)
at android.widget.AbsListView.onTouchUp(AbsListView.java:3926)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3698)
at android.view.View.dispatchTouchEvent(View.java:8717)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2577)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2300)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2502)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1729)
at android.app.Dialog.dispatchTouchEvent(Dialog.java:765)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2463)
at android.view.View.dispatchPointerEvent(View.java:8907)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4098)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3961)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3523)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3576)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3542)
at android.view.ViewRootImpl$Asy
Событие onContextItemSelected
отдаётся всем фрагментам текущей активити по очереди пока метод не вернёт true
(обработано). И так как у Вас в обоих фрагментах используется один и тот же идентификатор CM_RETURN_ID = 1
, то условие
if (item.getItemId() == CM_RETURN_ID)
выполняется в первом же по списку фрагменте.
Используйте разные идентификаторы или дополнительно проверяйте id
вызвавшего view
Как сделать, чтобы, если в поле на html страничке ввели правильный текст и нажали кнопку, то запускается скрипт? Хелп >~<
Есть сайт на wordpress, в котором установлена контактная форма contact form 7 с модулем внутри папки recaptchaphp, где есть такой код:
Почему-то на сайте на хостинге иногда не отображается фавиконПрикол в том, что это происходит периодически - раз отображается, в следующий...
Может ли кто-нибудь доступно объяснить, как работают свойства position и display точно и понятно? Что именно обозначают relative и absolute, как их комбинировать...