2017-05-29 64 views
0

我只有一个活动:机器人片段替换来回

package com.duandianer.ddr_v2.module.login.activity; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTabHost; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.widget.TabWidget; 

import com.duandianer.ddr_v2.R; 
import com.duandianer.ddr_v2.common.activity.BaseActivity; 
import com.duandianer.ddr_v2.common.fragment.BaseFragment; 
import com.duandianer.ddr_v2.module.login.fragment.FindPasswdFragment; 
import com.duandianer.ddr_v2.module.login.fragment.LoginFragment; 

public class LoginActivity extends BaseActivity { 
    private static int FRAGMENT_ID = R.id.login_view_bottom_fragment; 
    private FragmentManager mFragmentManager; 
    private FragmentTransaction mFragmentTransaction; 

    @Override 

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

     mFragmentManager = getSupportFragmentManager(); 
     replaceFragment(LoginFragment.class); 
    } 


    public void replaceFragment(Class<? extends BaseFragment> C) { 
     mFragmentTransaction = mFragmentManager.beginTransaction(); 
     Fragment old = mFragmentManager.findFragmentById(FRAGMENT_ID); 
     Log.d("ddr", old + ""); 
     try { 
      if (old == null) 
       mFragmentTransaction.add(FRAGMENT_ID, C.newInstance()); 
      else if (!C.isInstance(old)) { 
       mFragmentTransaction.replace(FRAGMENT_ID, C.newInstance()); 
      } 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     mFragmentTransaction.commit(); 
    } 
} 

我用replaceFragment()来替换片段

的login_view.xml是:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/login_view_top_background_height"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:contentDescription="@string/login_view_login_background_describe" 
      android:scaleType="centerCrop" 
      android:src="@mipmap/login_view_login_background" /> 

     <ImageButton 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginRight="@dimen/login_view_top_close_button_margin_top" 
      android:layout_marginTop="@dimen/login_view_top_close_button_margin_right" 
      android:background="#00000000" 
      android:contentDescription="@string/login_view_close_button_describe" 
      android:src="@mipmap/login_view_close_button" /> 
    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/login_view_bottom_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FFFFFF" /> 

</LinearLayout> 

然后我替换LoginFragment和FindPasswdFragment

之间片段LoginFragment是:

package com.duandianer.ddr_v2.module.login.fragment; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTabHost; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TabHost; 
import android.widget.TabWidget; 

import com.duandianer.ddr_v2.R; 
import com.duandianer.ddr_v2.common.fragment.BaseFragment; 

import java.lang.ref.SoftReference; 
import java.util.ArrayList; 

public class LoginFragment extends BaseFragment { 
    private final ArrayList<Fragment> Fragments = new ArrayList<>(); 
    private final ArrayList<CharSequence> Titles = new ArrayList<>(); 
    private SoftReference<View> mView; 

    private TabLayout mTabLayout; 
    private ViewPager mViewPager; 

    private ViewPagerAdapter mAdapter; 

    private final LoginFragment_LoginFragment loginFragment_loginFragment = 
      new LoginFragment_LoginFragment(); 

    private final LoginFragment_RegisterFragment loginFragment_registerFragment = 
      new LoginFragment_RegisterFragment(); 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     if (mView == null || mView.get() == null) { 
      View view = inflater.inflate(R.layout.login_view_login_fragment, null); 
      mView = new SoftReference<>(view); 

      mAdapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager()); 

      Fragments.add(loginFragment_loginFragment); 
      Fragments.add(loginFragment_registerFragment); 

      Titles.add("登录"); 
      Titles.add("注册"); 

      mTabLayout = (TabLayout) mView.get().findViewById(R.id.login_view_bottom_fragment_tab); 
      mViewPager = (ViewPager) mView.get().findViewById(R.id.login_view_bottom_fragment_viewpager); 

      mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

      mViewPager.setAdapter(mAdapter); 

      mTabLayout.setupWithViewPager(mViewPager); 

      Log.d("ddr", "create login"); 
     } 

     ViewGroup parent = (ViewGroup) mView.get().getParent(); 
     if (parent != null) 
      parent.removeView(mView.get()); 
     return mView.get(); 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mView = null; 
     mTabLayout = null; 
     mViewPager = null; 

     Log.d("ddr", "destroy login"); 
    } 

    private class ViewPagerAdapter extends FragmentPagerAdapter { 
     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return Fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return Fragments.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return Titles.get(position); 
     } 
    } 
} 

的FindPasswdFragment是:

package com.duandianer.ddr_v2.module.login.fragment; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

import com.duandianer.ddr_v2.R; 
import com.duandianer.ddr_v2.common.fragment.BaseFragment; 
import com.duandianer.ddr_v2.module.login.activity.LoginActivity; 
import com.duandianer.ddr_v2.module.login.controllers.LoginController; 

import java.lang.ref.SoftReference; 

public class FindPasswdFragment extends BaseFragment { 
    private SoftReference<View> mView; 

    private LoginController mController; 

    private Button mReturn; 

    private final OnClickListenerImpl onClickListener = new OnClickListenerImpl(); 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     if (mView == null || mView.get() == null) { 
      mView = new SoftReference<>(inflater.inflate(R.layout.login_view_find_passwd_fragment, null)); 

      mReturn = (Button) mView.get().findViewById(R.id.login_view_bottom_fragment_find_passwd_button_return); 
      mReturn.setOnClickListener(onClickListener); 

      mController = LoginController.SingTon.INSTANCE.getInstance((LoginActivity) getActivity()); 
     } 
     ViewGroup parent = (ViewGroup) mView.get().getParent(); 
     if (parent != null) 
      parent.removeView(mView.get()); 
     return mView.get(); 
    } 

    private class OnClickListenerImpl implements View.OnClickListener { 
     @Override 
     public void onClick(View v) { 
      if (v == mReturn) { 
       mController.replaceFragment(LoginFragment.class); 
      } 
     } 
    } 
} 

的LoginFragment使用viewpager和它含有其它两个片段

所以,问题是: 当我使用replaceFragment(FindPasswdFragment.class),它可以从LoginFragment跳转到FindPasswdFragment,并且效果很好。 但是,当我使用replaceFragment(LoginFragment.class)跳转从FindPasswdFragment到LoginFragment,一些问题已经提出了:在LoginFragment 两个子片段不visiable,只有两个选项卡。

我花了两天时间来解决这个问题,但我failed.I不知道为什么两个子片段不会visiable。 但我发现,两个子片段的onCreateView和双方的onDestroy不叫。

所以......你能帮助我吗?

回答

0

尝试更换上的登录片段:

mAdapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager()); 

mAdapter = new ViewPagerAdapter(getChildFragmentManager()); 

getChildFragmentManager()应该被用来处理内部片段的片段。

+0

它的工作原理!非常感谢你。 –

+0

但我不知道它为什么有效? –

+0

getChildFragmentManager()是fragment中使用的FragmentManager。在活动中使用getFragmentManager()或getSupportFragmentManager()。要查看关于此的完整解释,可以查看此答案:https://stackoverflow.com/a/14775322/5658915或访问有关片段的官方android文档:https://developer.android.com/reference/android/app /Fragment.html - https://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager()。希望它可以帮助你! –