41

여기에 단편 활동 인 하나의 주요 활동이 있습니다. 두 단편으로 두 개의 탭을 설정하고 있습니다. 단편 B에서 단 하나의 단 추를 가지고 있는데, 사용자가 단편 B를 단편 B로 변경하려고합니다. 위의 탭을 볼 수 있습니다 ...조각 탭 호스트에서 조각을 동적으로 변경 하시겠습니까?

어떻게 조각 내에서 조각을 대체 할 수 있습니까?

모든 솔루션에 크게 감사드립니다.

답변

92

기본 개념 - 우리는 컨테이너를 생성하여이를 달성 할 수 있습니다. 각 탭에는 특정 컨테이너가 지정됩니다. 이제 우리는 새로운 조각이 필요할 때이 컨테이너를 사용하여 동일한 조각을 대체 할 것입니다.

더 나은 이해를 위해 다음 코드를 단계별로 따라야합니다. 1 단계 : 앱 탭을 만듭니다. "Home.java"라고 말하십시오. 그것은 조각을 사용하여 탭을 만들기위한 코드를 포함합니다.

import android.os.Bundle; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v4.app.FragmentTabHost; 
    import android.widget.TextView; 
    import app.drugs.talksooner.container.GoContainerFragment; 
    import app.drugs.talksooner.container.LearnContainerFragment; 
    import app.drugs.talksooner.container.MoreContainerFragment; 
    import app.drugs.talksooner.container.TalkContainerFragment; 
    import app.drugs.talksooner.container.WatchContainerFragment; 
    import app.drugs.talksooner.utils.BaseContainerFragment; 

    public class Home extends FragmentActivity { 

     private static final String TAB_1_TAG = "tab_1"; 
     private static final String TAB_2_TAG = "tab_2"; 
     private static final String TAB_3_TAG = "tab_3"; 
     private static final String TAB_4_TAG = "tab_4"; 
     private static final String TAB_5_TAG = "tab_5"; 
     private FragmentTabHost mTabHost; 

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

     private void initView() { 
      mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
      mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

      // mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk", getResources().getDrawable(R.drawable.ic_launcher)), TalkContainerFragment.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk"), TalkContainerFragment.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec(TAB_2_TAG).setIndicator("Learn"), LearnContainerFragment.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec(TAB_3_TAG).setIndicator("Go"), GoContainerFragment.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec(TAB_4_TAG).setIndicator("Watch"), WatchContainerFragment.class, null); 
      mTabHost.addTab(mTabHost.newTabSpec(TAB_5_TAG).setIndicator("More"), MoreContainerFragment.class, null); 

      /* Increase tab height programatically 
      * tabs.getTabWidget().getChildAt(1).getLayoutParams().height = 150; 
      */ 

      for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) { 
       final TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); 
       if (tv == null) 
       continue; 
       else 
       tv.setTextSize(10); 

      } 

     } 

     @Override 
     public void onBackPressed() { 
      boolean isPopFragment = false; 
      String currentTabTag = mTabHost.getCurrentTabTag(); 
      if (currentTabTag.equals(TAB_1_TAG)) { 
       isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_1_TAG)).popFragment(); 
      } else if (currentTabTag.equals(TAB_2_TAG)) { 
       isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_2_TAG)).popFragment(); 
      } else if (currentTabTag.equals(TAB_3_TAG)) { 
       isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_3_TAG)).popFragment(); 
      } else if (currentTabTag.equals(TAB_4_TAG)) { 
       isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_4_TAG)).popFragment(); 
      } else if (currentTabTag.equals(TAB_5_TAG)) { 
       isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_5_TAG)).popFragment(); 
      } 
      if (!isPopFragment) { 
       finish(); 
      } 
     } 


    } 

귀하의 home.xml 파일

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <FrameLayout 
      android:id="@+id/realtabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" /> 


     <android.support.v4.app.FragmentTabHost 
      android:id="@android:id/tabhost" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      > 

      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="0dip" 
       android:layout_height="0dip" 
       android:layout_weight="0" /> 

     </android.support.v4.app.FragmentTabHost> 

    </LinearLayout> 

스텝 2 : 역 추적 및 조각의 교체 기기에 대한 도움이 될 것입니다 자료 컨테이너 단편 정의 "replaceFragement 체크 아웃()". 우리의 클래스 "BaseContainerFragment.java"

import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentTransaction; 
    import android.util.Log; 
    import app.drugs.talksooner.R; 

    public class BaseContainerFragment extends Fragment { 

     public void replaceFragment(Fragment fragment, boolean addToBackStack) { 
      FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
      if (addToBackStack) { 
       transaction.addToBackStack(null); 
      } 
      transaction.replace(R.id.container_framelayout, fragment); 
      transaction.commit(); 
      getChildFragmentManager().executePendingTransactions(); 
     } 

     public boolean popFragment() { 
      Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount()); 
      boolean isPop = false; 
      if (getChildFragmentManager().getBackStackEntryCount() > 0) { 
       isPop = true; 
       getChildFragmentManager().popBackStack(); 
      } 
      return isPop; 
     } 

    } 

3 단계 : 지금 여기에 내가 아니라 나머지를 희망 한 조각에 대한 고려하고는 동일한 방식으로 당신에 의해 처리 할 수 ​​있습니다. 컨테이너 Fragment 클래스 정의. 각 탭에는 특정 컨테이너가 있습니다. 첫 번째 탭에 TalkContainerFragment.java 말하기

import android.os.Bundle; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import app.drugs.talksooner.R; 
    import app.drugs.talksooner.Talk; 
    import app.drugs.talksooner.utils.BaseContainerFragment; 

    public class TalkContainerFragment extends BaseContainerFragment { 

     private boolean mIsViewInited; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      Log.e("test", "tab 1 oncreateview"); 
      return inflater.inflate(R.layout.container_fragment, null); 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 
      Log.e("test", "tab 1 container on activity created"); 
      if (!mIsViewInited) { 
       mIsViewInited = true; 
       initView(); 
      } 
     } 

     private void initView() { 
      Log.e("test", "tab 1 init view"); 
      replaceFragment(new Talk(), false); 
     } 

    } 

그것은 XML 파일입니다. "container_fragment.xml"이 xml 컨테이너에는 frameLayout이 포함되어 있습니다. 이 ID를 사용하여 다른 Fragments를 대체합니다.

<?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/container_framelayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 


    </FrameLayout> 

주류. "Talk.java"

public class Talk extends Fragment { 

     /** Define global variables over here */ 
     //private ProgressDialog pDialog; 
     StaticApiList sal; 
     TalkModelAll tma; 
     JSONObject myJasonObject = null; 
     private ListView lv; 
     private ArrayList<TalkModelAll> m_ArrayList = null; 
     //ArrayList<String> stringArrayList = new ArrayList<String>(); 
     TalkArrayAdapter taa; 
     Set<String> uniqueValues = new HashSet<String>(); 
     TextView rowTextView = null; 
     boolean vivek = false; 

     int postid; 
     String title; 
     String thumsrc; 
     String largeimg; 
     String excert; 
     String description; 
     String cat; 
     String myUrl; 
     String jsonString; 
     int mCurCheckPosition; 
     String check_state = null; 
     String ccc; 
     LinearLayout myLinearLayout; 

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

      View rootView = inflater.inflate(R.layout.talk, container, false); 

      Button btn = (Button) rootView.findViewById(R.id.your_btn_id); 
      btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
//Here TalkDetail is name of class that needs to open 
        TalkDetail fragment = new TalkDetail(); 
        // if U need to pass some data 
        Bundle bundle = new Bundle(); 

        bundle.putString("title", m_ArrayList.get(arg2).title); 
        bundle.putString("largeimg", m_ArrayList.get(arg2).largeimg); 
        bundle.putString("excert", m_ArrayList.get(arg2).excert); 
        bundle.putString("description", m_ArrayList.get(arg2).description); 
        bundle.putString("cat", m_ArrayList.get(arg2).cat); 
        //bundle.putInt("postid", m_ArrayList.get(arg2).postid); 

        fragment.setArguments(bundle); 
        ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true); 
       } 
      }); 

      return rootView; 
     } 
    } 

그게 전부입니다. 너는 가야한다. 전체 마법은 R.id. R.layout 대신에. 건배!

+5

위대한 직업입니다. 정말로 당신은 해커입니다.이게 내가 찾고있는 것입니다. +1 감사합니다. –

+0

그 작업 벌금 밖으로지도 ..하지만 어떻게 여기에지도를 사용 .. 만약 내가 BaseContainer 조각을 사용하여 nullPointerException 나주는. onClick of a Button을 프래그먼트로 리디렉션하여지도를 표시해야합니다. 제발 도와주세요 – user2199280

+0

@ user2199280 .. 당신은 단순히 귀하의 레이아웃에지도 frgament 정의해야합니다. :) .. 또한 귀하의 매니 페스트 파일에 Google 키 및 기타 자격 증명을 포함하는 것을 잊지 마십시오. – AndroidHacker

관련 문제