Как повторно показать и восстановить ранее добавленный фрагмент с его видом на контейнер - PullRequest
0 голосов
/ 08 февраля 2020

Здесь у меня есть код (функция) для загрузки фрагмента в контейнер ...

public void loadFragment(Fragment targetFragment, int containerId) {

    if (!targetFragment.isAdded()) {
        Toast.makeText(this, "Adding First Time", Toast.LENGTH_SHORT).show();
        supportFragmentManager.beginTransaction().add(containerId, targetFragment,targetFragment.getClass().getName()).commit();

    } else {
        Toast.makeText(this, "Showing The Privious Instance of Fragment", Toast.LENGTH_SHORT).show();
        supportFragmentManager.beginTransaction().attach(supportFragmentManager.findFragmentByTag(targetFragment.getClass().getName())).commit();
    }

}

Проблема с кодом if part работает правильно, если нет фрагмента, добавленного из фрагмента просто добавляет этот экземпляр фрагмента, но когда я пытаюсь перезагрузить этот фрагмент, ничего не происходит, кажется, что я сделал ошибку с else part, чтобы загрузить ранее добавленный фрагмент!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

После нескольких экспериментов!

Вот лучшее решение, которое я нашел!

Всякий раз, когда Fragment перезагружается, вызывается функция onCreate, которая возвращает представление, поэтому вместо создания нового экземпляра просматривать каждый раз, возвращать предыдущий экземпляр!

    
public class AnyFragment extends Fragment {

    //View of Fragment
    private View viewObj=null;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        //insted of inflating new view it will check for the previous view as well
        if(viewObj==null){
        viewObj= inflater.inflate(R.layout.fragment_output_sequeleye, container, false);
       }

        return viewObj;
    }
}

Также в деятельности вместо того, чтобы каждый раз создавать новый экземпляр, используйте только один экземпляр, созданный изначально, как показано ниже!

    
public class AnyActivity extends AppCompatActivity {
    //instance created
    AnyFragment anyFrag;

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

       //initializing the intsance        
       anyFrag=new AnyFragment()
       
       //using the privious ariable again insted of making new instance
       loadFragment(anyFrag,R.id.CONTAINERID);
       
    }


    //Your function which loads the fragment
    public void loadFragment(Fragment targetFragment, int containerId) {
        supportFragmentManager.beginTransaction().replace(containerId, targetFragment, targetFragment.getClass().getName()).commit();
    }


}
0 голосов
/ 08 февраля 2020

проблема в вашем коде: Вы забыли использовать метод отсоединения перед присоединением

в вашем коде:

     if (!targetFragment.isAdded()) {
                Toast.makeText(this, "Adding First Time", Toast.LENGTH_SHORT).show();
                supportFragmentManager.beginTransaction().add(containerId, targetFragment,targetFragment.getClass().getName()).commit();

            } else {
                Toast.makeText(this, "Showing The Privious Instance of Fragment", Toast.LENGTH_SHORT).show();
                supportFragmentManager.beginTransaction()
    .detach(supportFragmentManager.findFragmentByTag(targetFragment.getClass().getName()))    

.attach(supportFragmentManager.findFragmentByTag(targetFragment.getClass().getName()))
        .commit();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...