[android更新类的内容开发APP]四、项目布局的基本功能(继续)
昨天,只拿到电脑,别说,眼泪
http://joveth.github.io/funny/
1.选项卡的滑动效果
要知道。用这个选项卡就是想让它滑动起来,不然的话。我才不喜欢用它呢。
在让他滑动之前,先来说一下上一张 的问题。话说。依照设计器下载下来的包,替换到 我们的 res之后,我发现,tabhost的选项颜色没有变,在我尝试 了各种方法之后,最终,我tm放弃了,好吧。正好 找到了这个滑动效果的demo,还有选项卡的颜色切换效果。
话不多说 ,改进我们的东西吧。
1.改动我们的 acitivity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabHost android:id="@+id/tab_host" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="48dp" android:background="@drawable/tab_widget_bg" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 隐藏 --> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" > <fragment android:id="@+id/fragment_image" android:name="com.jov.germany.frame.ImageFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/fragment_text" android:name="com.jov.germany.frame.TextFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/fragment_both" android:name="com.jov.germany.frame.BothFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout>
这里面加入了viewpage。还有把FramLayout隐藏了
当中的布局文件:
res/color/tab_widget_text.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 标签页tab 文字切换颜色 --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/color_orange"/> <item android:color="#000"/> </selector>
value/color.xml中加入:
<color name="color_orange">#FF9224</color>
在来改动我们的 MainAcitivity.java
package com.jov.germany; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; import android.widget.TabHost.TabContentFactory; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class MainActivity extends FragmentActivity { public static final String PAGE1_ID = "page1"; public static final String PAGE2_ID = "page2"; public static final String PAGE3_ID = "page3"; private TabHost tabHost; // TabHost private List<View> views; // ViewPager内的View对象集合 private FragmentManager manager; // Activity管理器 private ViewPager pager; // ViewPager @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化资源 pager = (ViewPager) findViewById(R.id.viewpager); tabHost = (TabHost) findViewById(R.id.tab_host); manager = getSupportFragmentManager(); views = new ArrayList<View>(); views.add(manager.findFragmentById(R.id.fragment_image).getView()); views.add(manager.findFragmentById(R.id.fragment_text).getView()); views.add(manager.findFragmentById(R.id.fragment_both).getView()); // 管理tabHost開始 tabHost.setup(); // 传一个空的内容给TabHost,不能用上面两个fragment TabContentFactory factory = new TabContentFactory() { @Override public View createTabContent(String tag) { return new View(MainActivity.this); } }; // tab1 TabSpec tabSpec = tabHost.newTabSpec(PAGE1_ID); tabSpec.setIndicator(createTabView(R.string.fragment_image_str)); tabSpec.setContent(factory); tabHost.addTab(tabSpec); // tab2 TabSpec tabSpec2 = tabHost.newTabSpec(PAGE2_ID); tabSpec2.setIndicator(createTabView(R.string.fragment_text_str)); tabSpec2.setContent(factory); tabHost.addTab(tabSpec2); // tab3 TabSpec tabSpec3 = tabHost.newTabSpec(PAGE3_ID); tabSpec3.setIndicator(createTabView(R.string.fragment_both_str)); tabSpec3.setContent(factory); tabHost.addTab(tabSpec3); tabHost.setCurrentTab(0); // 管理tabHost结束 // 设置监听器和适配器 pager.setAdapter(new PageAdapter()); pager.setOnPageChangeListener(new PageChangeListener()); tabHost.setOnTabChangedListener(new TabChangeListener()); } /** * PageView Adapter * * @author Administrator * */ private class PageAdapter extends PagerAdapter { @Override public int getCount() { return views.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup view, int position, Object arg2) { view.removeView(views.get(position)); } @Override public Object instantiateItem(ViewGroup view, int position) { try { if (views.get(position).getParent() == null) { view.addView(views.get(position)); } else { ((ViewGroup) views.get(position).getParent()) .removeView(views.get(position)); view.addView(views.get(position)); } } catch (Exception e) { e.printStackTrace(); } return views.get(position); } } /** * 标签页点击切换监听器 * * @author Administrator * */ private class TabChangeListener implements OnTabChangeListener { @Override public void onTabChanged(String tabId) { if (PAGE1_ID.equals(tabId)) { pager.setCurrentItem(0); } else if (PAGE2_ID.equals(tabId)) { pager.setCurrentItem(1); } else if (PAGE3_ID.equals(tabId)) { pager.setCurrentItem(2); } } } /** * ViewPager滑动切换监听器 * * @author Administrator * */ private class PageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { tabHost.setCurrentTab(arg0); } } /** * 创建tab View * * @param string * @return */ private View createTabView(int stringId) { View tabView = getLayoutInflater().inflate(R.layout.tab, null); TextView textView = (TextView) tabView.findViewById(R.id.tab_text); textView.setText(stringId); return tabView; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
当中的layout/tab.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/state_tabs_bg" > <TextView android:id="@+id/tab_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:layout_gravity="center_horizontal" android:textSize="18sp" android:textColor="@color/tab_widget_text"/> </LinearLayout>
drawable/state_tabs_bg.xml
<?xml version="1.0" encoding="utf-8"?> <!-- tab每一个标签背景 --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@drawable/tabs_selected_bg" /> <item android:drawable="@drawable/tabs_normal_bg"></item> </selector>
drawable/tabs_selected_bg.xml
<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="@color/color_orange" /> </shape> </item> <item android:bottom="5dp"> <shape> <solid android:color="#eeeeee" /> </shape> </item> </layer-list>
drawable/tabs_normal_bg.xml
<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="@color/color_orange" /> </shape> </item> <item android:bottom="1dp"> <shape> <solid android:color="#eeeeee" /> </shape> </item> </layer-list>
好至此的话 我们的代码算是ok了,可是当你执行的时候却发现跑不起来。为啥 呢???
且看一下我们的Frame里面,改动ImageFrame.java:
package com.jov.germany.frame; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.jov.germany.R; public class ImageFrame extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.image_frame, container, false); } }
你可能会认为没什么差别,看一下我们的Fragment引用的包,不一样哦。
好吧,最后MainAcitivity.java中的String内容自己 在string.xml里面自己加把
没有截滑动效果。
近期各种忙,更新的 有点慢,没办法啊
版权声明:本文博客原创文章,博客,未经同意,不得转载。