-2

从FragmentActivity获取片段视图(ActionBarSherlock)

我有TabHostFragmentActivitySherlockFragmentActivity)。

如何从FragmentActivity获取标签(FragmentView?当然没有static的方式。

我FragmentActivity代码

 

public class Landing extends SherlockFragmentActivity implements ProgressBarIndeterminateCallback { 

    private ActionBar __ab; 
    private TabHost __th; 
    private TabManager __tm; 
    private boolean __isWorking=false; 
    public static Utils __utils; 

    @SuppressLint("InlinedApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     super.onCreate(savedInstanceState); 
     __ab = getSupportActionBar(); 
     __ab.setDisplayShowTitleEnabled(false); 
     __ab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#5EBDCF"))); 
     setSupportProgressBarIndeterminateVisibility(false); 
     setContentView(R.layout.tab_bottom_layout); 
     __th = (TabHost)findViewById(android.R.id.tabhost); 
     __th.setup(); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      __th.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE); 
      __th.getTabWidget().setDividerPadding(0); 
     } else { 
      __th.getTabWidget().setDividerDrawable(getResources().getDrawable(R.drawable.tab_divider)); 
     } 
     __tm = new TabManager(this,__th,android.R.id.tabcontent,this); 
     __tm.addTab(createTab("signin","Sign In"),SignIn.class,null); 
     __tm.addTab(createTab("signup","Sign Up"),SignUp.class,null); 
     if (savedInstanceState != null) { 
      __th.setCurrentTabByTag(savedInstanceState.getString("current_tab")); 
     } 
     __utils = new Utils(getApplicationContext()); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.landing, menu); 
     return (super.onCreateOptionsMenu(menu)); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu (final Menu menu) { 
     return super.onPrepareOptionsMenu(menu); 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.menu_resend_code: 
     break; 
     case R.id.menu_reset_password: 
     break; 
     case R.id.menu_about: 
      startActivity(new Intent(getApplicationContext(), About.class)); 
     break; 
     } 
     return (super.onOptionsItemSelected(item)); 
    } 

    @Override 
    protected void onResume(){ 
     super.onResume(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("current_tab", __th.getCurrentTabTag()); 
    } 

    private TabSpec createTab(final String tag,final String title){ 
     final View tab = LayoutInflater.from(__th.getContext()).inflate(R.layout.landing_tab, null); 
     ((TextView)tab.findViewById(R.id.text)).setText(title); 
     return __th.newTabSpec(tag).setIndicator(tab); 
    } 

    public static class TabManager implements TabHost.OnTabChangeListener { 

     private final Landing __landing; 
     private final FragmentActivity __fa; 
     private final TabHost __th; 
     private final int __containerID; 
     private final HashMap<String, TabInfo> __ti = new HashMap<String, TabInfo>(); 
     TabInfo __lastTab; 

     static final class TabInfo { 

      private final String __tag; 
      private final Class<?> __class; 
      private final Bundle __args; 
      private Fragment __fragment; 

      TabInfo(String tag, Class<?> clss, Bundle args) { 
       __tag = tag; 
       __class = clss; 
       __args = args; 
      } 

     } 

     static class DummyTabFactory implements TabHost.TabContentFactory { 
      private final Context mContext; 
      public DummyTabFactory(Context context) { 
       mContext = context; 
      } 

      @Override 
      public View createTabContent(String tag) { 
       View v = new View(mContext); 
       v.setMinimumWidth(0); 
       v.setMinimumHeight(0); 
       return v; 
      } 
     } 

     public TabManager(FragmentActivity activity, TabHost tabHost, int containerId, Landing landing) { 
      __landing = landing; 
      __fa = activity; 
      __th = tabHost; 
      __containerID = containerId; 
      __th.setOnTabChangedListener(this); 
     } 

     public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { 
      tabSpec.setContent(new DummyTabFactory(__fa)); 
      String tag = tabSpec.getTag(); 
      TabInfo info = new TabInfo(tag, clss, args); 
      info.__fragment = __fa.getSupportFragmentManager().findFragmentByTag(tag); 
      if (info.__fragment != null && !info.__fragment.isDetached()) { 
       FragmentTransaction ft = __fa.getSupportFragmentManager().beginTransaction(); 
       ft.detach(info.__fragment); 
       ft.commit(); 
      } 
      __ti.put(tag, info); 
      __th.addTab(tabSpec); 
     } 

     @Override 
     public void onTabChanged(String tabId) { 
      if(__landing.__isWorking == false){ 
       SignUp.__isAvatarProvided = false; 
       TabInfo newTab = __ti.get(tabId); 
       if (__lastTab != newTab) { 
        FragmentTransaction ft = __fa.getSupportFragmentManager().beginTransaction(); 
        if (__lastTab != null) { 
         if (__lastTab.__fragment != null) { 
          ft.detach(__lastTab.__fragment); 
         } 
        } 
        if (newTab != null) { 
         if (newTab.__fragment == null) { 
          newTab.__fragment = Fragment.instantiate(__fa,newTab.__class.getName(), newTab.__args); 
          ft.add(__containerID, newTab.__fragment, newTab.__tag); 
         } else { 
          ft.attach(newTab.__fragment); 
         } 
        } 
        __lastTab = newTab; 
        ft.commit(); 
        __fa.getSupportFragmentManager().executePendingTransactions(); 
       } 
      } 
     } 
    } 

    @Override 
    public void startProgressBarIndeterminate() { 
     __isWorking = true; 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       __th.getTabWidget().setEnabled(false); 
       setSupportProgressBarIndeterminateVisibility(true); 
      } 
     });  
    } 

    @Override 
    public void stopProgressBarIndeterminate() { 
     __isWorking = false; 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       __th.getTabWidget().setEnabled(true); 
       setSupportProgressBarIndeterminateVisibility(false); 
      } 
     }); 
    } 

} 

 

+0

可以请您发表您的FragmentActivity代码 – Neil 2013-03-20 07:13:55

+0

张贴在这里,您已经TR代码IED。 – 2013-03-20 08:32:12

+0

我已经添加了代码,很抱歉给您带来不便。 – 2013-03-20 15:02:26

回答

0

内活动:

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

       Fragment yourFragment = new YourFragment(); 

       //put fragment to activity 
       //YOUR_FRAGMENT_ID is "@+id/" tag for fragment in your_activity.xml 
       getSupportFragmentManager().beginTransaction().replace(R.id.YOUR_FRAGMENT_ID, yourFragment).commit(); 
       getSupportFragmentManager().executePendingTransactions(); 

       //get reference to fragment 
       Fragment refToYourFragment = (Fragment) getSupportFragmentManager().findFragmentById(YOUR_FRAGMENT_ID); 
      } 
+0

我想获取视图,而不是片段本身。 – 2013-03-21 08:31:47

+0

这是可能的(afaik,yourFragment.findViewById(...)可以帮助)。但是,您不应该从外部访问片段视图,因为在这种情况下,片段不会像它应该的那样是一个不相关的可重用组件。如果您不需要这种片段特征,则可能更容易将其他布局膨胀而不是片段添加到活动布局中。这个问题在这里介绍:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – 2013-03-21 09:55:01

+0

@RodionAltshuler如果我没有定义XML片段?请参阅我的相关问题:http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity – 2014-07-19 07:36:10

相关问题