2016-10-26 2 views
0

Я не могу получить фрагмент для обновления после изменения данных. Я звонюandroid - Fragment onCreateView не вызывается после обновления и совершает транзакцию

getFragmentManager(). BeginTransaction(). Detach (this) .attach (this) .commit();

, но onCreateView не вызывается. Я попробовал несколько различных способов в refreshFragment(). Я вижу сообщения для «I/InjectionManager: dispatchCreateOptionsMenu» после того, как я вставил вышеприведенную строку кода, так что что-то происходит, но onCreateView() не получает вызов.

public class MainActivityFragment extends Fragment { private static Logger logger = Logger.getLogger(MainActivityFragment.class); String poolWord = "ABCDE"; String newWord = ""; public MainActivityFragment() { } @Override public void onCreate(Bundle savedInstanceState) { logger.info("onCreate------------------------"); super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { logger.info("onCreateView------------------------"); // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_main, container, false); GridView gridViewPool = (GridView) view.findViewById(R.id.gridviewPool); gridViewPool.setAdapter(new LetterImageAdapter(getActivity(), poolWord)); gridViewPool.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { logger.error("po " + position); updateWords(position); refreshFragment(); } }); GridView gridviewNewWord = (GridView) view.findViewById(R.id.gridviewNewWord); gridviewNewWord.setAdapter(new LetterImageAdapter(getActivity(), "")); return view; } private void refreshFragment() { logger.info("refreshFragment------------------------"); getFragmentManager().beginTransaction().detach(this).attach(this).commit(); // getFragmentManager().beginTransaction().replace(R.id.fragment, this).attach(this).commit(); // Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment); //getFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit(); getFragmentManager().executePendingTransactions(); }

+0

Я модифицировал refreshFragment() и разбил его на отдельные строки, а затем добавил некоторые записи, чтобы увидеть, отсоединен ли фрагмент. isDetached возвращает false как до, так и после вызова транзакции. detach(). Я новичок в этом, поэтому не знаю, что может произойти – user6627139

ответ

0

Через несколько часов, я получил его на работу. Не уверен в деталях, так как это мой первый проект для Android. Отправка ответа в случае, если кто-то другой имеет ту же проблему.

Суть проблемы, я подозреваю, это сгенерированный код от Intellij не начал транзакцию в классе Activity. Он не включает

if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new MainActivityFragment()) 
       .commit(); 
    } 

Я не знаю, как мой MainActivityFragment был создан без этого, но он was.I также заменил сгенерированную активность-main.xml с одним я имел из учебника. У одного из Intellij не было android: id, который я мог бы использовать для объекта контейнера. В нем также содержатся другие вещи, которые мне не нужно в этом полиэтничного новой деятельностной main.xml выглядит следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" 
     android:layout_width="match_parent" android:layout_height="match_parent" 
     tools:context=".MainActivity" tools:ignore="MergeRootFrame"/> 

старый генерироваться один был:

<android.support.design.widget.AppBarLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay"/> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_main"/> 

</android.support.design.widget.CoordinatorLayout> 

Был также содержание -main.xml, от которого я избавился. Это может быть то, что андроид использовал для создания моего MainActivityFragment без явного кода. Кто-то, более опытный разработчиком Android, может ответить на это.

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/fragment" 
     android:name="com.ultramondo.mywordandroid.MainActivityFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     tools:layout="@layout/fragment_main"> 

    </fragment> 

Я уверен, что есть некоторые полезные вещи я могу вернуться, но сейчас я хочу простоту. Мне также пришлось внести некоторые изменения в использование пакетов android.support.v4.app для классов Fragment и Transaction. Это похоже на то, чтобы прийти в середине фильма и выяснить, что это за сюжет. Как только я увижу весь фильм, я уверен, что он станет яснее.

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