【问题标题】:How to include the activity in fragment tabs ?如何在片段选项卡中包含活动?
【发布时间】:2014-01-31 07:19:36
【问题描述】:

我正在开发一个应用程序,其中有两个片段选项卡。按下选项卡时会出现相应的片段。效果很好。但是我想要片段选项卡内的活动。我正在为此使用 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

    }

片段类

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();
            }
        });
    }
}

我想在片段B中包含以下活动

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");
            }
        });

    }
}

我有很多创建的活动要包含在片段中..在片段类的 onActivityCreated 中重新创建它是不可想象的。据此,我必须修改我的主应用程序。

【问题讨论】:

  • 您不能在片段内运行活动。充其量,您可以在片段中包含片段。

标签: android android-fragments actionbarsherlock


【解决方案1】:

片段不能承载活动。您可以使用嵌套片段代替活动。 一个简单的教程:http://xperiment-andro.blogspot.com/2013/02/nested-fragments.html

【讨论】:

    【解决方案2】:

    您不能在片段内运行活动。充其量,您可以在片段中包含一个片段。 因此,在这种情况下,您可以做的最好的事情是创建一个 Fragment 并将其添加到您的 FragmentB 中,而不是创建一个 Activity

    【讨论】:

      【解决方案3】:

      就像法希姆所说的“ 片段不能承载活动。除了活动,您可以使用嵌套片段"

      如果您阅读 Docs,Fragment 就像活动一样。将您的活动更改为 Fragment 很容易

      这就是 developer.android 所说的

      要创建片段,您必须创建片段的子类(或它的现有子类)。 Fragment 类的代码看起来很像 Activity。它包含类似于活动的回调方法,例如 onCreate()、onStart()、onPause() 和 onStop()。 事实上,如果您要将现有的 Android 应用程序转换为使用片段,您可能只需将代码从 Activity 的回调方法移动到片段的相应回调方法中。

      通常,您应该至少实现以下生命周期方法:

      onCreate() 系统在创建片段时调用它。在您的实现中,您应该初始化您希望在片段暂停或停止然后恢复时保留的片段的基本组件。

      onCreateView() 当片段第一次绘制其用户界面时,系统会调用它。要为您的 Fragment 绘制 UI,您必须从此方法返回一个 View,它是 Fragment 布局的根。如果片段不提供 UI,则可以返回 null。

      onPause() 系统调用此方法作为用户离开片段的第一个指示(尽管它并不总是意味着片段正在被销毁)。这通常是您应该提交任何应该在当前用户会话之后持久化的更改(因为用户可能不会回来)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        相关资源
        最近更新 更多