2015-05-10 2 views
0

У меня есть ящик для навигации по умолчанию, чтобы создать мой исходный фрагмент. Теперь из моей основной деятельности я перехожу к следующему действию, где выполняю некоторые операции и возвращаюсь к mainactivity, используя onActivityResult.Получить результат деятельности в Фрагмент

Upto здесь все работает нормально. Вот моя проблема.

У меня есть список в моем HomeFragment, поэтому в onActivityResult я получаю значения, которые выполняются в другом действии. Теперь как передать эти значения в мой домашний фрагмент.

Это, как я начать новую деятельность с mainactivity:

Intent i = new Intent(MainActivity.this, AddTask.class); 
startActivityForResult(i,1); 

Теперь В AddTask я выполняю некоторые операции и отправить обратно в основной деятельности, как показано ниже:

Intent i = new Intent(AddTask.this,MainActivity.class); 
setResult(RESULT_OK, i); 
finish(); 

Теперь в моем MainActivity onActivityResult:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
       if(resultCode == RESULT_OK){ 
        AddedTask = data.getStringExtra("NewTask"); 
        CategoryName= data.getStringExtra("CategoryItem"); 
        TaskTime=data.getStringExtra("TaskTime"); 

        SharedPreferences settings = getSharedPreferences("taskdetails", 
         Context.MODE_PRIVATE); 

        SharedPreferences.Editor editor = settings.edit(); 
        editor.putString("NewTask", AddedTask); 
        editor.putString("CategoryItem", CategoryName); 
        editor.putString("TaskTime", TaskTime); 
        editor.commit(); 

       } 
       if (resultCode == RESULT_CANCELED) { 
        //Write your code if there's no result 
       } 
      } 
    } 

Теперь у меня есть listView в моем HomeFragment, где я необходимо обновить эти значения:

public class HomeFragment extends Fragment { 
    ListView lv; 
    static final String TAG ="HomeFragment"; 
    private AdapterListViewData adapterListViewData; 
    private ArrayList<DataShow> listData = new ArrayList<DataShow>(); 
    private ListView listViewData; 
    String CategoryName,TaskTime; 
    String AddedTask; 
    public HomeFragment(){} 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
     listViewData = (ListView)rootView.findViewById(R.id.listViewData); 

     SharedPreferences settings = this.getActivity().getSharedPreferences("taskdetails", 
       Context.MODE_PRIVATE); 
     AddedTask = settings.getString("NewTask",null); 
     CategoryName= settings.getString("CategoryItem",null); 
     TaskTime=settings.getString("TaskTime",null); 
     listData.add(new DataShow(AddedTask,CategoryName,TaskTime)); 
     adapterListViewData = new AdapterListViewData(getActivity().getBaseContext(),listData); 
     adapterListViewData.notifyDataSetChanged(); 
     return rootView; 
    } 



} 

У меня нет ошибок, и список не отображается. Пожалуйста, посоветуйте мне.

+0

@ downvoter-Care, чтобы комментировать – coder

+0

Я отправил 2 ответов. Я думаю, что мой последний при использовании newInstance() достаточен для ваших нужд. –

ответ

0

Проблема заключается в том, что в навигационном ящике есть меню в mainactivity, а не в домашнем фрагменте. Поэтому onActivityResult указывает на mainactivity вместо моего HomeFragment. После изменения меню на HomeFragment была разрешена моя проблема.

Спасибо всем людям, которые помогли мне :)

0

Из того, что я вижу, вы никогда не устанавливали свой адаптер в свой списокView.

Итак, добавьте следующие варианты создания нового AdapterListViewData и делать .notifyDataSetChanged()

listViewData.setAdapter(adapterListViewData); 
+0

Проблема заключается не в установке адаптера, но в невозможности получить детали, добавленные в listview. – coder

0

Существуют различные способы достижения этого.

В основном я использую автобус событий для связи между фрагментами и видами деятельности. Вы можете использовать этот очень рекомендуемый автобус событий Otto by Square.

http://square.github.io/otto/

Вы можете Subscribe к событию в Fragment. Когда вы получите результаты в ActivityProduce, отправьте это событие и отправьте Fragment.

0

Кажется, существует проблема синхронизации между onCreateView() из HomeFragment и onActivityResult() в MainActivity. Google рекомендует использовать Bundle для аргументов данных и Интерфейс для связи между Activity и Fragment (s). Его нетрудно настроить, и это хорошее знание для других целей вашего приложения.

В любом случае, я отправил ответ в прошлом с подробными разъяснениями @Passing data between fragments contained in an activity (поиск моего имени пользователя, если не найдено сразу). Я хотел бы показать фрагмент, образец отправки данных фрагмента, от Google веб-страницы @Communicating with Other Fragments:

// Create fragment and give it an argument for the selected article 
ArticleFragment newFragment = new ArticleFragment(); 
Bundle args = new Bundle(); 
args.putInt(ArticleFragment.ARG_POSITION, position); 
newFragment.setArguments(args); 
0

Я просто думал о другом, возможно, лучше, проще ответить.Поскольку вы зависите от onCreateView() от HomeFragment, вы можете передавать данные через newInstance(). Веб-страница Google @Fragment. Хороший пример - текст поиска «static MyFragment newInstance». Для операции найдите текст для «Фрагмент newFragment = MyFragment.newInstance (« Из аргументов »)». Фрагменты кода на этой странице для вашего HomeFragment:

public static class MyFragment extends Fragment { 
    CharSequence mLabel; 

    /** 
    * Create a new instance of MyFragment that will be initialized 
    * with the given arguments. 
    */ 
    static MyFragment newInstance(CharSequence label) { 
     MyFragment f = new MyFragment(); 
     Bundle b = new Bundle(); 
     b.putCharSequence("label", label); 
     f.setArguments(b); 
     return f; 
    } 

Для деятельности:

@Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_arguments); 

    if (savedInstanceState == null) { 
     // First-time init; create fragment to embed in activity. 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     Fragment newFragment = MyFragment.newInstance("From Arguments"); 
     ft.add(R.id.created, newFragment); 
     ft.commit(); 
    } 
} 

Я считаю, что вы можете легко заменить код самостоятельно. Ваш код показывает хорошее понимание Android. Удачи, получайте удовольствие, держите нас в курсе ...

Смежные вопросы