Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Por que ao rotacionar, o fragment é recriado antes da activity?


Activity:

@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);

       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"MainActivity.onCreate();");

        setContentView
(R.layout.activity_layout);

        actionBar
= getSupportActionBar();
        drawerlayout
= (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerlayout
.setDrawerShadow(R.drawable.drawer_shadow,
               
GravityCompat.END);

       
// cancelaNotificacao(R.drawable.ic_launcher);

       
Intent it = new Intent(this, MyService.class);

       
if (!MyService.RUNNING) {

            startService
(it);
       
}

        bindService
(it, this, 0);

   
}

   
@Override
   
public void onServiceConnected(ComponentName name, IBinder binderservice) {
       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"Activity onServiceConnected");
       
LocalBinder binder = (LocalBinder) binderservice;
       
this.service = binder.getService();

        carregaRadio
();

       
if (!service.isIRCConnected()) {
            carregaLogin
();
       
} else {
            carregaChatdoService
();

       
}

             actionBar
.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

   
}

private void carregaRadio() {
       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"Carregando fragment radio.");

       
ActionBar.Tab tab = actionBar.newTab()
               
.setCustomView(createTabCustomView(TITLE_TAB_RADIO))
               
.setTabListener(
                       
new MyTabListener<RadioFragment>(this, TITLE_TAB_RADIO,
                               
RadioFragment.class));
        actionBar
.addTab(tab, 0);

   
}

private void carregaChat() {
       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"Carregando fragment chat.");

       
ActionBar.Tab tab = actionBar.newTab()
               
.setCustomView(createTabCustomView(MyService.CANAL))
               
// .setText(TITLE_TAB_CHAT)
               
.setTabListener(
                       
new MyTabListener<ChatFragment>(this, MyService.CANAL,
                               
ChatFragment.class));
        actionBar
.addTab(tab, 1, true);

       
// ADICIONAR O USERSFRAGMENT NO DRAWER DO CHAT
       
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft
.add(R.id.drawer_container, new UserListFragment(),
                TAG_USERS_FRAGMENT
).commit();

   
}

private void carregaLogin() {
       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"Carregando fragment login.");

       
ActionBar.Tab tab = actionBar.newTab()
               
.setCustomView(createTabCustomView(TITLE_TAB_LOGIN))
               
// .setText(TITLE_TAB_LOGIN)
               
.setTabListener(
                       
new MyTabListener<LoginFragment>(this, TITLE_TAB_LOGIN,
                               
LoginFragment.class));
        actionBar
.addTab(tab, 1, true);

   
}

private void carregaChatdoService() {
       
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
               
"Activity reaberta, pegando dados do service.");

        carregaChat
();

       
try {

           
for (Conversa adapter : service.getAllPVTAdapters()) {

               
String nick = service.getUsersAdapter()
                       
.getUser(adapter.getUUID()).getNick();

               
ActionBar.Tab tab = actionBar.newTab()
                       
.setCustomView(createTabCustomView(nick))
                       
.setTabListener(
                               
new MyTabListener<ChatFragment>(this, adapter
                                       
.getUUID().toString(),
                                       
ChatFragment.class));
                actionBar
.addTab(tab);
           
}

       
} catch (Exception e) {
           
Crashlytics.logException(e);
           
Crashlytics
                   
.log(Log.ERROR,
                            TAG_ACTIVITY_LIFECYCLE
,
                           
"Erro ao tentar recuperar todos os pvts do service");
       
}

   
}



ChatFragment (O fragment que eh responsavel por exibir uma conversa, possui basicamente um listivew e um edittext):

@Override
   
public View onCreateView(LayoutInflater inflater, ViewGroup container,
           
Bundle savedInstanceState) {

       
Crashlytics.log(Log.INFO, TAG_FRAGMENT_LIFECYCLE,
               
"ChatFragment.onCreateView();");

       
// Em algumas versões do Android, este metódo ocasionará o chamado do
       
// metodo onOptionsMenuCreate() imediatamente
        setHasOptionsMenu
(true);

       
View view = inflater.inflate(R.layout.chat_layout, container, false);

        edittext
= (MyEditText) view.findViewById(R.id.chatinput);
        edittext
.setOnEditorActionListener(this);

        listview
= (ListView) view.findViewById(R.id.chatlist);

        bt_send
= (ImageView) view.findViewById(R.id.sendbutton);
        bt_send
.setOnClickListener(this);

        registerForContextMenu
(listview);

       
return view;
   
}

   
@Override
   
public void onActivityCreated(Bundle savedInstanceState) {
       
super.onActivityCreated(savedInstanceState);

       
Crashlytics.log(Log.INFO, TAG_FRAGMENT_LIFECYCLE,
               
"ChatFragment.onActivityCreated();");

        activity
= (MainActivity) getActivity();

       
if (this.isChannel()) {
            conversa
= activity.getService().getCanalAdapter();
       
} else {
            conversa
= activity.getService().getPVTAdapter(
                    UUID
.fromString(getArguments().getString(EXTRA_ARGUMENT)));
       
}

        listview
.setAdapter(conversa);

       
// se estiver voltando de uma rotação, savedInstanceState vai ser
       
// diferente de null
       
if (savedInstanceState != null) {

           
// salva a posicao na variavel global para ser recuperada no
           
// onresume
            listview_position_recover
= savedInstanceState
                   
.getInt(LISTSTATE, -1);

           
// se antes da rotação o teclado estava aberto, abre-o novamente
           
if (savedInstanceState.getBoolean(KEYBOARDSTATE)) {
                openKeyboard
(1000);
               
// se não for um delay grande não abre essa m...
           
}

       
}

   
}

TabListener:
public class MyTabListener<T extends Fragment> implements
           
ActionBar.TabListener {
       
private Fragment mFragment;
       
private final Activity mActivity;
       
private final String mTag;
       
private final Class<T> mClass;

       
/**
         * Constructor used each time a new tab is created.
         *
         * @param activity
         *            The host Activity, used to instantiate the fragment
         * @param tag
         *            O TARGET DO FRAGMENT, SERA USADO PARA RECUPERAR O ADAPTER
         * @param clz
         *            The fragment's Class, used to instantiate the fragment
         */

       
public MyTabListener(Activity activity, String tag, Class<T> clz) {
           
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
                   
"Criando tablistener da tab " + tag + ".");
            mActivity
= activity;
            mTag
= tag;
            mClass
= clz;

            mFragment
= getSupportFragmentManager().findFragmentByTag(mTag);
       
}

       
/* The following are each of the ActionBar.TabListener callbacks */

       
@SuppressLint("UseValueOf")
       
public void onTabSelected(Tab tab, FragmentTransaction ft) {

           
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE, "tab " + mTag
                   
+ " selecionada.");

           
// CONTROLE DA EXIBICAO DO FRAGMENT DE USERS
           
// O DRAWER SOMENTE EXIBIRA SE O CANAL ESTIVER SENDO EXIBIDO
           
if (mTag.equalsIgnoreCase(MyService.CANAL)) {
               
MainActivity.this.drawerlayout
                       
.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
           
} else {
               
MainActivity.this.drawerlayout
                       
.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
           
}

           
// Check if the fragment is already initialized
           
if (mFragment == null) {
               
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
                       
"mFragment == null, instanciando.");
               
// If not, instantiate and add it to the activity
               
Bundle args = new Bundle();
                args
.putString(ChatFragment.EXTRA_ARGUMENT, mTag);
                mFragment
= Fragment.instantiate(mActivity, mClass.getName(),
                        args
);
                ft
.add(R.id.fragment_container, mFragment, mTag);
           
} else {
               
Crashlytics.log(Log.INFO, TAG_ACTIVITY_LIFECYCLE,
                       
"mFragment != null, attach()");
               
// If it exists, simply attach it in order to show it
                ft
.attach(mFragment);
           
}

           
// TRATAMENTO DA TAB QUANDO SELECIONADA
           
TextView textview;
           
try {
                textview
= getTabCustomView(tab);

               
// COR DE SELECAO
                textview
.setTextColor(Color.WHITE);
                textview
.setShadowLayer(new Float(20.0), new Float(0.0),
                       
new Float(0.0), Color.WHITE);

           
} catch (TabNotFoundException e) {
               
Crashlytics.logException(e);
           
}

       
}

       
public void onTabUnselected(Tab tab, FragmentTransaction ft) {

           
if (mFragment != null) {

               
// por usar um customview, o titulo precisa receber um tom mais
               
// apagado manualmente nas tabs nao selecionadas
               
TextView textview;

               
try {
                    textview
= getTabCustomView(tab);

                    textview
.setTextColor(getResources().getColor(
                            R
.color.irc_color_14_grey));
                    textview
.setShadowLayer(0, 0, 0, 0);

               
} catch (TabNotFoundException e) {
                   
Crashlytics.logException(e);
               
}

               
// Detach the fragment, because another one is being attached
                ft
.detach(mFragment);
           
}
       
}

       
public void onTabReselected(Tab tab, FragmentTransaction ft) {
           
// geralmente nao faz nada....

       
}
   
}

To ficando meio perdido, nao sei mesmo o que fazer. O fragment tem que acessar a referencia do service na activity somente após o onServiceConnected() dela. Aguardo ajuda.
Desde já, obrigado.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário