2014-01-31 2 views
1

Я разрабатываю приложение, в котором есть два фрагментарных фрагментов. При нажатии на вкладки появляются соответствующие фрагменты. Это работает отлично. Но я хочу, чтобы активность внутри фрагментов. Для этого я использую библиотеку ABS.Как включить активность на вкладках фрагментов?

ActionBar bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     ActionBar.Tab tab1 = bar.newTab(); 
     ActionBar.Tab tab2 = bar.newTab(); 
tab1.setText("Fragment A"); 
     tab2.setText("Fragment B"); 
tab1.setTabListener(new MyTabListener<FragmentA>(this, "tab1", 
       FragmentA.class, null)); 
     tab2.setTabListener(new MyTabListener<FragmentB>(this, "tab1", 
       FragmentB.class, null)); 
     } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      // app icon in action bar clicked; go Location selection 
      Intent intent = new Intent(FragmentDemoActivity.this, 
        TestActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("tab", getSupportActionBar() 
       .getSelectedNavigationIndex()); 
    } 

listnerclass является

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

    public MyTabListener(FragmentActivity activity, String tag, Class<T> clz, 
      Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     FragmentTransaction ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 
     mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(
       mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment 
        .instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
      ft.commit(); 
     } else { 
      ft.attach(mFragment); 
      ft.commit(); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     if (mFragment != null) { 
      ft.detach(mFragment); 
      ft.commitAllowingStateLoss(); 
     } 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

Fragmentclass

public class FragmentB extends Fragment { 
    Button button; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
    { 
     return inflater.inflate(R.layout.frag_b, group, false); 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     button = (Button) getActivity().findViewById(R.id.button2); 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
       builder.setTitle("Fragment B"); 
       builder.setMessage("What would you like to do?"); 
       builder.setPositiveButton("Nothing", null); 
       builder.setNegativeButton("Leave me alone!", null); 
       builder.show(); 
      } 
     }); 
    } 
} 

я Wnt включить следующую деятельность в fragmentB

public class TestActivity extends Activity { 

    Button b1, b2; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.testactivity); 
     b1 = (Button) findViewById(R.id.button1); 
     b2 = (Button) findViewById(R.id.button2); 

     tv = (TextView) findViewById(R.id.textView1); 
     b1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       tv.setText("You Clicked on Button 1"); 
      } 
     }); 
     b2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       tv.setText("You Clicked on Button 2"); 
      } 
     }); 

    } 
} 

У меня есть много созданных Активности включить в фрагмент ... нереально воссоздать inActivityCreated класса фрагмента. в соответствии с этим я должен изменить свое основное приложение.

+0

Вы не можете запускать операцию внутри фрагмента. В лучшем случае вы можете иметь фрагмент внутри фрагмента. – SMR

ответ

1

Вы не можете управлять деятельностью внутри фрагмента. В лучшем случае вы можете иметь фрагмент внутри фрагмента. , поэтому самое лучшее, что вы можете сделать в этой ситуации, вместо создания Activity вы можете создать Fragment и добавить его в свой FragmentB.

0

Как Фахим Саид « Отрывок не может принимать у себя деятельность Вместо активности, вы можете использовать вложенную фрагмент.»

Фрагменты точно так же как деятельности, если вы читаете Docs.Changing Ваша деятельность фрагмент легко

Это то, что developer.android говорит

чтобы создать фрагмент, необходимо создать подкласс фрагмента (или существующий подкласс этого). Класс Fragment имеет код, который очень похож на Activity. Он содержит методы обратного вызова, подобные активности, такие как onCreate(), onStart(), onPause() и onStop(). Фактически, если вы конвертируете существующее приложение Android для использования фрагментов, вы можете просто переместить код из методов обратного вызова вашей активности в соответствующие методы обратного вызова вашего фрагмента.

Как правило, вы должны выполнять по крайней мере следующие методы жизненного цикла:

OnCreate() Система называет это при создании фрагмента. В рамках вашей реализации вы должны инициализировать основные компоненты фрагмента, которые вы хотите сохранить, когда фрагмент приостановлен или остановлен, а затем возобновлен.

onCreateView() Система называет это, когда пришло время для фрагмента, чтобы сделать его пользовательский интерфейс в первый раз. Чтобы нарисовать пользовательский интерфейс для вашего фрагмента, вы должны вернуть представление из этого метода, который является корнем макета вашего фрагмента. Вы можете вернуть значение null, если фрагмент не предоставляет пользовательский интерфейс.

OnPause() Система вызывает этот метод как первый признак того, что пользователь покидает фрагмент (хотя это не всегда означает, что фрагмент разрушается). Обычно вы должны фиксировать любые изменения, которые должны сохраняться за пределами текущего сеанса пользователя (поскольку пользователь может не вернуться).

Смежные вопросы