【问题标题】:How to show ListView in Tab?如何在 Tab 中显示 ListView?
【发布时间】:2013-03-18 07:06:11
【问题描述】:

我想在 Tab 中显示 ListView(选择此选项卡后我希望 ListView 出现),所以我创建了 Fragment 类并将 ListView 代码放入其中。现在的主要问题是将片段对象传递给 tabListener。请在此处发布示例,或者更好地展示如何在我的代码中执行此操作。无论如何,我们将不胜感激。

public class MainActivity extends Activity {

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

        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.Tab tabOne = actionBar.newTab().setText("One");
        ActionBar.Tab tabTwo = actionBar.newTab().setText("Two");


        tabOne.setTabListener(new tabListener());
        tabTwo.setTabListener(new tabListener());

        actionBar.addTab(tabOne);
        actionBar.addTab(tabTwo);   
        } 


    protected class tabListener implements ActionBar.TabListener {

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {

        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {

        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {

        }
    };

    public class FirstFragment extends ListFragment {
        private ArrayList<Cinemas> cinema;
        private CinemasAdapter cinemaAdapter;
        private ListView list;

          @Override
          public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            cinema = new Handler().handle(); 
            cinemaAdapter = new CinemasAdapter(MainActivity.this, R.layout.movie_data_row, cinema);
            setListAdapter(cinemaAdapter);
          }

          @Override
          public void onListItemClick(ListView l, View v, int position, long id) {
              Cinemas movie = cinemaAdapter.getItem(position);
                Intent intent = new Intent (MainActivity.this, More.class);
                intent.putExtra("Cinemas", movie);
                intent.putExtra("data", movie.getBitmap());

                Bundle translateBundle =
                      ActivityOptions.makeCustomAnimation(MainActivity.this,
                      R.anim.slide_in_left, R.anim.slide_out_left).toBundle();
              startActivity (intent, translateBundle);
          }
        } 

}

【问题讨论】:

    标签: android android-layout android-fragments android-actionbar android-tabs


    【解决方案1】:

    通常在使用选项卡创建活动时, 为标签内容设置单独的活动很容易。
    但是,当这些活动需要时,事情会变得棘手 互相交流。

    所以解决方案是创建一个带有视图的 tabactivity (而不是活动)作为选项卡内容。 要创建 TAB,我们需要遵循几个步骤:

    1. 创建tabHost并设置其参数
    2. 创建 tabWidget,可点击标签的容器
    3. 创建一个 frameLayout,以保存与每个选项卡关联的视图
    4. 使用 tabSpec 类创建每个选项卡

    看看这些链接,对你有帮助

    http://joshclemm.com/blog/?p=59

    http://www.edumobile.org/android/android-beginner-tutorials/tab-control/

    http://www.pocketmagic.net/?p=1132

    【讨论】:

    • 感谢您的回答。 TabHost 支持滑动吗?
    【解决方案2】:

    如果要打开 tabTwo 内的列表,则需要创建 FirstFragment 类的实例,并在选择选项卡时将其添加到视图中。

    onTabSelected 内部,如果FirstFragment 不为空,则创建一个新实例,并将其添加到您的activity_main 文件中容器内的视图中。容器是视图内的线性布局,具有片段应占用的给定空间。在全屏片段的情况下,容器是根布局。您只需要为此布局指定一个 id。创建新片段后,通过调用 transaction.attach(); 附加它。最终的代码块应该类似于:

    /** this example assumes that the fragment
     * FirstFragment will be attached to tab 1
     * which is at position = 0, and SecondFragment
     * will be attached to tab 2, which is at 
     * position = 1. Also, the root layout of 
     * activity_main.xml has the id attribute of
     * fragment_container
     */
    
    FirstFragment firstFragment;
    SecondFragment secondFragment;
    
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction transaction) {
        switch (tab.getPosition()) {
        case 0:
            if (firstFragment == null) {
                firstFragment = new FirstFragment();
                transaction.add(R.id.fragment_container,
                        firstFragment, "FIRST");
    
            } else {
                transaction.attach(firstFragment);
            }
            break;
        case 1:
            if (secondFragment == null) {
                secondFragment = new SecondFragment();
                transaction.add(R.id.fragment_container, secondFragment, "SECOND");
            } else {
                transaction.attach(secondFragment);
            }
            break;
        }
    }
    

    【讨论】:

    • 我已尝试按照您的建议进行操作,但应用程序因此错误而崩溃(java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView)我做错了什么?跨度>
    • @AvanJogia 你搞定了吗?听起来您的错误是您的 ListFragment 类特别发生的错误,而不是它与活动的连接方式。检查课程以确保其正常工作并告诉我它是如何进行的。
    • 我们不能动态地做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多