編輯:關於Android編程
如果不看這些,就直接下托
RadioButton和CheckBox的區別:
1、單個RadioButton在選中後,通過點擊無法變為未選中
單個CheckBox在選中後,通過點擊可以變為未選中
2、一組RadioButton,只能同時選中一個
一組CheckBox,能同時選中多個
3、RadioButton在大部分UI框架中默認都以圓形表示
CheckBox在大部分UI框架中默認都以矩形表示
RadioButton和RadioGroup的關系:
1、RadioButton表示單個圓形單選框,而RadioGroup是可以容納多個RadioButton的容器
2、每個RadioGroup中的RadioButton同時只能有一個被選中
3、不同的RadioGroup中的RadioButton互不相干,即如果組A中有一個選中了,組B中依然可以有一個被選中
4、大部分場合下,一個RadioGroup中至少有2個RadioButton
5、大部分場合下,一個RadioGroup中的RadioButton默認會有一個被選中,並建議您將它放在RadioGroup中的起始位置
簡單代碼
選中項變更的事件監聽:
當RadioGroup中的選中項變更後,您可能需要做一些相應,比如上述例子中,性別選擇“女”後下面的本文也相應改變,又或者選擇不同的性別後,出現符合該性別的頭像列表進行更新,女生不會喜歡使用大胡子作為自己的頭像。
TextView tv = null;//根據不同選項所要變更的文本控件 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //根據ID找到該文本控件 tv = (TextView)this.findViewById(R.id.tvSex); //根據ID找到RadioGroup實例 RadioGroup group = (RadioGroup)this.findViewById(R.id.radioGroup); //綁定一個匿名監聽器 group.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup arg0, int arg1) { // TODO Auto-generated method stub //獲取變更後的選中項的ID int radioButtonId = arg0.getCheckedRadioButtonId(); //根據ID獲取RadioButton的實例 RadioButton rb = (RadioButton)MyActiviy.this.findViewById(radioButtonId); //更新文本內容,以符合選中項 tv.setText("您的性別是:" + rb.getText()); } }); }
項目中有許多地方用到了RadioGroup和Fragment組合實現切換類似於微博、微信底部的切換
ViewPager+RadioGroup+Fragment 超高仿微信主界面,可通過左右滑動或點擊底部RadioButton切換
activity_main.xml<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
style.xml
MainActivity.Java
package com.example.administrator.first.activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.widget.RadioButton; import android.widget.RadioGroup; import com.example.administrator.first.R; import com.example.administrator.first.adapter.myFragmentPagerAdapter; import com.example.administrator.first.fragment.ContactsFragment; import com.example.administrator.first.fragment.DiscoveryFragment; import com.example.administrator.first.fragment.MeFragment; import com.example.administrator.first.fragment.WeChatFragment; import java.util.ArrayList; public class MainActivity extends FragmentActivity{ private ViewPager mPager; private RadioGroup mGroup; private RadioButton rbChat,rbContacts,rbDiscovery,rbMe; private ArrayListfragmentList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化界面組件 initView(); //初始化ViewPager initViewPager(); } private void initView(){ mPager=(ViewPager)findViewById(R.id.viewPager); mGroup=(RadioGroup)findViewById(R.id.radiogroup); rbChat=(RadioButton)findViewById(R.id.rb_chat); rbContacts=(RadioButton)findViewById(R.id.rb_contacts); rbDiscovery=(RadioButton)findViewById(R.id.rb_discovery); rbMe=(RadioButton)findViewById(R.id.rb_me); //RadioGroup選中狀態改變監聽 mGroup.setOnCheckedChangeListener(new myCheckChangeListener()); } private void initViewPager(){ WeChatFragment weChatFragment=new WeChatFragment(); ContactsFragment contactsFragment=new ContactsFragment(); DiscoveryFragment discoveryFragment=new DiscoveryFragment(); MeFragment meFragment=new MeFragment(); fragmentList=new ArrayList (); fragmentList.add(weChatFragment); fragmentList.add(contactsFragment); fragmentList.add(discoveryFragment); fragmentList.add(meFragment); //ViewPager設置適配器 mPager.setAdapter(new myFragmentPagerAdapter(getSupportFragmentManager(), fragmentList)); //ViewPager顯示第一個Fragment mPager.setCurrentItem(0); //ViewPager頁面切換監聽 mPager.setOnPageChangeListener(new myOnPageChangeListener()); } /** *RadioButton切換Fragment */ private class myCheckChangeListener implements RadioGroup.OnCheckedChangeListener{ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId){ case R.id.rb_chat: //ViewPager顯示第一個Fragment且關閉頁面切換動畫效果 mPager.setCurrentItem(0,false); break; case R.id.rb_contacts: mPager.setCurrentItem(1,false); break; case R.id.rb_discovery: mPager.setCurrentItem(2,false); break; case R.id.rb_me: mPager.setCurrentItem(3,false); break; } } } /** *ViewPager切換Fragment,RadioGroup做相應變化 */ private class myOnPageChangeListener implements ViewPager.OnPageChangeListener{ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position){ case 0: mGroup.check(R.id.rb_chat); break; case 1: mGroup.check(R.id.rb_contacts); break; case 2: mGroup.check(R.id.rb_discovery); break; case 3: mGroup.check(R.id.rb_me); break; } } @Override public void onPageScrollStateChanged(int state) { } } }
myFragmentPagerAdapter
package com.example.administrator.first.adapter; import android.support.v4.app.FragmentManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import java.util.ArrayList; /** * Created by Administrator on 2015/6/24. */ public class myFragmentPagerAdapter extends FragmentPagerAdapter { ArrayListlist; public myFragmentPagerAdapter(FragmentManager fm, ArrayList list){ super(fm); this.list=list; } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }
拓展:
在MainActivity中實例化各個Fragment和RadioButton和RadioParent的控件,設置好監聽器。在這裡我定義了一個switchFragment()的方法,判斷切換的Fragment是否已經添加過,避免每一次切換Fragment的時候都調用add()或者replace(),而是通過hide()和show(),減少頻繁地創建新的實例。
private void switchFragment(Fragment fragment) { //判斷當前顯示的Fragment是不是切換的Fragment if(mFragment != fragment) { //判斷切換的Fragment是否已經添加過 if (!fragment.isAdded()) { //如果沒有,則先把當前的Fragment隱藏,把切換的Fragment添加上 getSupportFragmentManager().beginTransaction().hide(mFragment) .add(R.id.main_fragment,fragment).commit(); } else { //如果已經添加過,則先把當前的Fragment隱藏,把切換的Fragment顯示出來 getSupportFragmentManager().beginTransaction().hide(mFragment).show(fragment).commit(); } mFragment = fragment; } }
實現思路
從圖我們基本猜到基本思路如下:
底部選項卡可以使用3個RadioButton組成,並綁定相關的監聽器以監聽tab切換。
選項卡的上面的部分為一個容器(FrameLayout)以存取3個fragment,可以在tab綁定的監聽器中去控制fragment的顯示。
布局文件
R.layout.activity_main
<framelayout android:id="@+id/fl_contain" android:layout_above="@id/ll_rbtn_contain" android:layout_alignparenttop="true" android:layout_height="match_parent" android:layout_width="match_parent"> </framelayout>
根視圖為相對布局以控制RadioGroup在底部,FrameLayout在RadioGroup的上面
設置選項卡Style
每個RadioButton都設置了統一的tab_style
設置選項卡icon的背景
每個radioButton都設置了Android:drawableTop屬性,只要創建三個drawable文件即可 eg :tab_first_background.xml
設置選項卡title的背景
除了選顯卡對應的icon要改變外,其對應的title的字體顏色也要隨之改變。注意要在res下創建color文件夾並將顏色狀態配置文件放在此文件夾下。eg:radio_colors.xml
Main.java
package com.example.tabapp; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.FrameLayout; import android.widget.RadioButton; public class MainActivity extends FragmentActivity implements OnCheckedChangeListener{ //三個選項卡 private RadioButton mRBtnFrist; private RadioButton mRBtnSecond; private RadioButton mRBtnThrid; //存放fragment對應的容器 private FrameLayout mFragmentContain; private TabFragment mFirstFragment; private TabFragment mSecondFragment; private TabFragment mThirdFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFragmentContain = (FrameLayout)findViewById(R.id.fl_contain); mRBtnFrist = (RadioButton)findViewById(R.id.rb_first); mRBtnSecond = (RadioButton)findViewById(R.id.rb_second); mRBtnThrid = (RadioButton)findViewById(R.id.rb_thrid); mRBtnThrid.setOnCheckedChangeListener(this); mRBtnThrid.performClick();//此處設置默認第三個選項卡對應的fragment顯示 mRBtnFrist.setOnCheckedChangeListener(this); mRBtnSecond.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { //用戶當前浏覽的選項卡 int checkedWidgetId = buttonView.getId(); mRBtnFrist.setChecked(checkedWidgetId == R.id.rb_first); mRBtnSecond.setChecked(checkedWidgetId == R.id.rb_second); mRBtnThrid.setChecked(checkedWidgetId == R.id.rb_thrid); showFragment(checkedWidgetId); }else { //此處記錄了用戶上次浏覽的選項卡 String unCheckFragmentTag = getTagById(buttonView.getId()); TabFragment unCheckFragment = (TabFragment)getSupportFragmentManager().findFragmentByTag(unCheckFragmentTag); if(unCheckFragment != null){ //隱藏上次顯示到fragment,確保fragment不會重疊 getSupportFragmentManager() .beginTransaction() .hide(unCheckFragment) .commit(); } } } /** * 顯示對應的fragment * @param checkedRadioBtnId */ private void showFragment(int checkedRadioBtnId){ String tag = getTagById(checkedRadioBtnId); TabFragment mainFragment = (TabFragment) getSupportFragmentManager().findFragmentByTag(tag); if(mainFragment == null){ //如果沒有找到對應的fragment則生成一個新的fragment,並添加到容器中 TabFragment newFragment = new TabFragment(tag); getSupportFragmentManager() .beginTransaction() .add(R.id.fl_contain, newFragment, tag) .commit(); }else { //如果找到了fragment則顯示它 getSupportFragmentManager() .beginTransaction() .show(mainFragment) .commit(); } } /** * 為三個fragment分別取三個不同到tag名 * @param widgetId * @return */ private String getTagById(int widgetId){ if(widgetId == R.id.rb_first){ return "first"; }else if(widgetId == R.id.rb_second){ return "second"; }else { return "thrid"; } } }
前言:從Android Studio開始,就支持jni和.so庫調用了。環境:Windows 7+Android Studio2.1.2+NDK版本:android-nd
(1)使用數據庫mysql,腳本語言如下: /* 用戶表*/ CREATE TABLE `usertbl` ( `id` int(11) NOT NULL AUTO_
在項目的開發過程我們離不開圖片,而有時候需要調用本地的圖片,有時候需要調用拍照圖片。同時實現拍照的方法有兩種,一種是調用系統拍照功能,另一種是自定義拍照功能。而本博文目前
最近由於項目太大了,導致編譯通不過(Android對一個應用中的方法個數貌似有限制),所以一直琢磨著能否將某些模塊的APK不用安裝,動態加載,通過在網上查找