startActivityForResult из ListFragment, по-видимому, не вызывает onActivityResult - PullRequest
1 голос
/ 06 июля 2011

Я попробовал «фиксированный» jar здесь:

http://code.google.com/p/android/issues/detail?id=15394

, а также полностью переустановил SDK, и ни один из подходов все еще не устранил проблему, возникшую у меня здесь.Так что startActivityForResult просто не идет от ListFragment?

Оригинальный пост:

У меня есть ClientListView, который является ListFragment, что когда кнопка на панели действийпри щелчке по нему выбирается то, что выбрано в представлении ListFragment, и запускается новое действие по редактированию выбранного клиента (или, если другой клиент щелкает по новому клиенту все вместе).

Все это запускается нормально.Фрагмент ClientListView и ClientDetailsFragment заменены моей EditClientActivity FragmentActivity (которая вызывает фрагмент ClientEdit).Это занимает весь экран и создает кнопку сохранения / отмены на панели действий.

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

MainActivity FragmentActivity устанавливает ClientListView ListFragment и ClientDetailsActivity FragmentActivity (который имеет фрагмент ClientDetails).Затем ClientListView ListFragment после выбора новой или редактируемой клиентской опции может запуститьActivityForResult для EditClientActivity (в котором есть фрагмент ClientEdit).

Фрагмент ClientEdit устанавливает меню параметров для отмены сохранения, после выбора сохранения во фрагменте ClientEdit происходит несколько вещей:

новый клиент или отредактированный клиент сохраняется вбаза данных.mEditListener.onEditComplete() называется.Поскольку вызывающий FragmentActivity EditClientActivity реализует onEditCompleteListener, который я использую onAttach во фрагменте ClientEdit.

Итак, мой EditClientActivity имеет метод onEditComplete(long id):

public void onEditComplete(long id) {
    Intent in  = new Intent();
    this.setResult(1, in); //just something to let the ClientListView that the client i saved refresh the list.
    Toast.makeText(this.getBaseContext(), "Client Saved", Toast.LENGTH_LONG).show();
    finish(); //go back to our listview and client details view
}

В моем ClientListView (типа ListFragment) у меня есть это:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
     this.setHasOptionsMenu(true);
     //which columns to put as the cursor
 String[] columns = new String[] { "firstname", "lastname" };
 //how to post those columns into the layout.  check client_row.xml for these ids
 int[] to = new int[] { R.id.client_first_name_list_label,  R.id.client_last_name_list_label};

    myCursor = getClientsCursor(); //this is NOT closing the database connection if it does it gets an error

    theClients = new SimpleCursorAdapter(this.getListView().getContext(),
    R.layout.client_row, myCursor, columns, to);
    setListAdapter(theClients);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
        case R.id.new_client:
                // TODO: add recipe
                showClientEdit(-1);
                return true;
        case R.id.client_delete:
                // TODO: delete recipe
                Toast.makeText(getActivity(), "Delete Client selected", Toast.LENGTH_LONG).show();
                return true;
        case R.id.client_edit:
               if(mCurrentSelectedItemIndex!=-1)
                   showClientEdit(mCurrentSelectedItemIndex);
               else
                  Toast.makeText(getActivity(), "Select client to edit!", Toast.LENGTH_LONG).show();
               return true;
        case android.R.id.home:
                // TODO: Handle app icon click
                Toast.makeText(getActivity(), "Home icon selected", Toast.LENGTH_LONG).show();
                return true;
        default:                
               return super.onOptionsItemSelected(item);
    }
}


void showClientEdit(long someId)
{
  ..do stuff to get the right client to pass to the intent
  Intent intent = new Intent(getActivity(), EditClientActivity.class);
  // Send the recipe index to the new activity
  intent.putExtra(EditClientActivity.SELECTED_CLIENT, clientId);
  startActivityForResult(intent, Activity.RESULT_OK);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
   //never gets here :(
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(this.getListView().getContext(), "Result code: " +resultCode , Toast.LENGTH_LONG).show();
        if(resultCode ==1)
        {
            myCursor = getClientsCursor(); //not sure if i need this for the next line or not, want my list to update with newly
            //added client or edited client names etc...
            theClients.notifyDataSetChanged();                
            Toast.makeText(this.getListView().getContext(), "Data set notified!!!" , Toast.LENGTH_LONG).show();
        }                       
}

Проблема в том, что мой startActivityForRestult вызывает EditClientActivity из ListFragment?Насколько я могу судить, никогда не звонит onActivityResult.Я предоставил всю эту информацию, чтобы попытаться выяснить и понять, как Fragment / FragmentActivities и тому подобное должны взаимодействовать друг с другом.Я делаю это таким образом, исходя из того, что я узнал, изучая руководства, руководства для разработчиков и т. Д. Я очень доволен своим прогрессом, но сейчас за стеной ... и, вероятно, осознавать, что я делаю вещи, просто не правильно...Я хотел бы быть просветленным.Для меня это самая трудная часть Android - это управление тем, как все эти действия и представления взаимодействуют друг с другом ....

Ответы [ 3 ]

1 голос
/ 11 декабря 2016

Я понимаю, что этот вопрос старый, но я хотел предоставить решение для тех, кто задал этот вопрос, как я делал, когда они искали, почему ваш onActivityResult не работает, когда Intent вызывается изнутрифрагмент (ListFragment или обычный Fragment будет иметь тот же результат).

Вы должны позвонить своему startActivityForResult из основного занятия.Поэтому обязательно вызовите getActivity(), когда вы вызываете его из фрагмента, подобного этому:

getActivity().startActivityForResult(Intent,ACTIVITY_INT);
1 голос
/ 06 июля 2011

Используете ли вы библиотеку совместимости для фрагментов?

Существует проблема с пакетом совместимости, ошибка onActivityResult внутри фрагментов.Взгляните сюда http://code.google.com/p/android/issues/detail?id=15394.Там же вы можете скачать jar-файл с фиксированной версией.

0 голосов
/ 08 июля 2011

Чёрт возьми, понял это.Это был способ, которым я использовал код результата / запроса:

startActivityForResult(intent, Activity.RESULT_OK);

был не способ запустить его, добавил еще один номер вместо Activity.RESULT_OK, и это сработало,Я должен запутаться.

...