国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安卓 仿學習app項目

2019-11-09 17:27:24
字體:
來源:轉載
供稿:網友

之前寫過一個項目,想把自己寫的里面的一些技術點記錄下來,也相當于給自己做筆記。同時也跟大家一起分享一下,若碰到同樣的問題的朋友,也可以相互交流一下,新手上路,請多多指教。在那期間呢,碰到以及出現過許多的錯誤,這里就在這記錄一下。

1、關于找錯:這僅對于新手來說:1、當你思路不清楚時,或你為什么達不到你要的效果時,你要學會從頭理,理清順序,看自己是在哪個環節哪個步驟寫錯了,比如可能你的方法沒寫全之類的小問題,這要耐心,畢竟心急吃不了熱豆腐。

2、高級控件自動補全 《Autocompl》 同一個適配器(adapter)可以作用于多個數據 需要通過適配器拿到數據 一般默認兩個(也就是要寫兩個字符串才提示) 如需默認一個需加屬性complettionThreshold=”1” (2,)多個自動補全框《multiautocopleteTextview》 分割符: 默認逗號 new multAutocompl 下拉列表 《spinner》 listview 集合

3、如果一個項目區間引用第三方控件 如果要刪除第三方控件的話 其另一個引用他的控件也要刪除其引用的那行代碼

4、解析viewpager+xml 只需解析布局 主要代碼如下:

View chanese= LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_chinese,null);

但解析viewpager+activity需要得到布局 也需要其activity (包含java代碼)主要代碼如下:

LocalActivityManager manager=new LocalActivityManager(this,true); manager.dispatchCreate(savedInstanceState);Intent intent=new Intent(MainActivity.this,ChineseActivity.class); View chinese= manager.startActivity("viewID",intent).getDecorView();//轉成view

5、數據庫版本問題 不能一個大 一個小 只能一起升級 這樣就不會報版本號的錯誤

接下來就講講我項目中用到的一些技術點吧,由于一些問題我就不截圖了:

首先當app首次安裝必定有個導航頁;

其用到的是 sharedPRefence+viewpager+handler

剛開始進是有個歡迎界面,在歡迎界面里面判斷你是否是第一次進入;其代碼如下:

activity:

import android.content.Intent;import android.content.SharedPreferences;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class WelcomeActivity extends AppCompatActivity { @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); shipToNavigationOrFrame(); } //判斷且實現應跳轉導航動畫還是主界面private void shipToNavigationOrFrame() { // Toast.makeText(WelcomeActivity.this, "3333", Toast.LENGTH_SHORT).show();boolean firstFlag; //是否首次安裝SharedPreferences sharedPreferences = getSharedPreferences("flag", MODE_PRIVATE); firstFlag = sharedPreferences.getBoolean("first", true); final Intent intent = new Intent(); if (firstFlag) { // Toast.makeText(WelcomeActivity.this, "4444", Toast.LENGTH_SHORT).show();intent.setClass(this, NavigationActivity.class); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("first", false); editor.apply(); //apply與commit作用相同,雖沒返回值,但效率更高} else { intent.setClass(this, SplashhActivity.class); } new Handler().postDelayed(new Runnable() { //延時1.5秒@Overridepublic void run() { startActivity(intent); WelcomeActivity.this.finish(); finish(); } },1500);}}

其對應的xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_welcome"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"tools:context="com.example.activity_appui.WelcomeActivity"android:background="@drawable/welcome"></LinearLayout>

接下來就是導航頁了,其代碼如下:

activity:

import android.content.Intent;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class NavigationActivity extends AppCompatActivity { private ViewPager vPager; private ViewGroup pointGroup; private List vList; private ImageView[] pointImgViews; //裝載導航小圓點@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation); /// Toast.makeText(NavigationActivity.this, "555", Toast.LENGTH_SHORT).show();initView(); setvPager(); addPoints(); setAdapterForViewPager(); } //加載主頁面控件private void initView(){ // Toast.makeText(NavigationActivity.this, "555", Toast.LENGTH_SHORT).show();vPager = (ViewPager)findViewById(R.id.navigation_vp); pointGroup = (ViewGroup)findViewById(R.id.viewPoints); // getSupportActionBar().hide();} private void setvPager(){ LayoutInflater inflater = getLayoutInflater(); vList = new ArrayList<View>(); vList.add(inflater.inflate(R.layout.navigation_page,null)); vList.add(inflater.inflate(R.layout.navigation_page2,null)); vList.add(inflater.inflate(R.layout.navigation_page3,null)); PagerAdapter myAdapter = new PagerAdapter(){ @Overridepublic int getCount() { return vList.size(); } @Overridepublic void destroyItem(ViewGroup container, int position, Object object) { // super.destroyItem(container, position, object);container.removeView((View) vList.get(position)); } @Overridepublic Object instantiateItem(ViewGroup container, int position) { container.addView((View) vList.get(position)); return vList.get(position); } @Overridepublic boolean isViewFromObject(View view, Object object) { return view==object; } }; vPager.setAdapter(myAdapter); } private void addPoints(){ ImageView pointImgView; pointImgViews = new ImageView[vList.size()]; //確定小圓點的個數 //動態添加小圓點for(int i=0; i<vList.size(); i++) { pointImgView = new ImageView(NavigationActivity.this); pointImgView.setLayoutParams(new ViewGroup.LayoutParams(25, 25)); //設置圓點大小pointImgView.setPadding(5, 0, 5, 0); pointImgViews[i] = pointImgView; // 默認選中的是第一張圖片,此時第一個小圓點是選中狀態,其他不是if (i == 0) pointImgViews[i].setImageDrawable(getResources().getDrawable( R.drawable.i1)); elsepointImgViews[i].setImageDrawable(getResources().getDrawable( R.drawable.i3)); // 將imageviews添加到小圓點視圖組pointGroup.addView(pointImgViews[i]); } } //添加監聽器,將相應頁面的小圓點設置為選中狀態private void setAdapterForViewPager(){ vPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Overridepublic void onPageSelected(int position) { for (int i = 0; i < pointImgViews.length; i++) { // 當前view下設置小圓點為未選中狀態pointImgViews[i].setImageDrawable(getResources().getDrawable( R.drawable.i1)); //設置小圓點為選中狀態if(position == i) pointImgViews[i].setImageDrawable(getResources().getDrawable( R.drawable.i3)); } } @Overridepublic void onPageScrollStateChanged(int state) { } }); } //點擊button后調用,跳轉到主界面,勿忘設置參數public void shipToFrame(View v){ Intent intent = new Intent(this, DownActivity.class); startActivity(intent); this.finish(); }}

xml:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"tools:context="com.example.activity_appui.NavigationActivity"> <android.support.v4.view.ViewPagerandroid:id="@+id/navigation_vp"android:layout_width="match_parent"android:layout_height="match_parent"/> <LinearLayoutandroid:id="@+id/viewPoints"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout_marginBottom="15dp"android:gravity="center_horizontal"android:orientation="horizontal"android:paddingBottom="150dp"> </LinearLayout></FrameLayout>

因為導航頁就是一張張滑動的,就用viewpager+activity,activity里面就放張圖片,這里就貼一個activity出來,其余都是一樣的。

xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:background="@drawable/navigation_image"></RelativeLayout>

這樣就能實現導航頁了。當你第二次登錄時,你便進入引導頁,像QQ那樣每次進去便出現那個熟悉的小企鵝。可以用countdonwntime,線程也可以實現這個效果。本人就是用線程實現的。代碼如下:

activity:

import android.content.Intent;import android.content.SharedPreferences;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class SplashhActivity extends AppCompatActivity { private ImageView splash_img; private TextView tv_control; private TextView tv_control2; private Intent intent; private Thread thread; private boolean bool; @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splashh); splash_img = (ImageView) findViewById(R.id.splash_img); tv_control = (TextView) findViewById(R.id.tv_control); tv_control2 = (TextView) findViewById(R.id.tv_control2); // 跳轉頁面intent = new Intent(SplashhActivity.this, DownActivity.class); bool = true; thread = new Mythread(); thread.start(); } //處理Handler handler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); int i = msg.what; tv_control.setText(i + "秒"); } }; public void jump(View view) { bool = false; //開始跳startActivity(intent); finish(); } //子線程class Mythread extends Thread { @Overridepublic void run() { super.run(); for (int i = 5; i >= 0; i--) { handler.sendEmptyMessage(i); SystemClock.sleep(1000); } //當他等于true的時候跳while (bool) { //跳轉 Intent 意圖Intent intent = new Intent(SplashhActivity.this, DownActivity.class); //開始跳startActivity(intent); break; } //直接返回主頁面finish(); } }}

xml:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_splashh"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.activity_appui.SplashhActivity"> <ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/g_1"android:id="@+id/splash_img"android:scaleType="fitXY"/> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv_control"android:background="#3f5348"android:textSize="30sp"android:layout_gravity="right"android:text="倒計時"/> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv_control2"android:background="#3f5348"android:textSize="30sp"android:layout_gravity="bottom|right"android:onClick="jump"/></FrameLayout>

進了引導頁之后自然便進入主界面,主界面排版:textview,ViewPager,ViewPager+fragment……. 其中用ViewPager實現圖片自動播放加點擊事件,一般像一個學習app這樣的功能就是點擊任意一張圖片你便能進入其自己app公眾號或是其自己的網站還有的就是廣告。 其代碼如下:

activity:private ImageView topmain_imags;//得到圖片集合int images[] = {R.drawable.guid1, R.drawable.guid2, R.drawable.guid3, R.drawable.guid4};//定義一個全局變量 當前的變量為0int currentIndex = 0;private Thread thread;private Spinner main_spinner;private TextView tv_class;private TextView tv_c1;private ListView lv_main;private ViewPager vp_viewpage_activity;private List<View> list;//表示裝載滑動的布局private RadioGroup rp_grooup_clazz;private RadioGroup rg_main;List<Fragment> view = new ArrayList<>();private RadioGroup rg_down;private Button rb_study;private Button rb_find;private Button rb_my;private ViewPager vp;private List<View> views = new ArrayList<View>();private ImageView iv, iv2;//iv代表小圓點,iv2代表viewPager的圖片private int images2[] = {R.drawable.guid1, R.drawable.guid2, R.drawable.guid3, R.drawable.guid4};private Myadapter mAdapter;private final int AUTO_MSG = 1;private static final int PHOTO_CHANGE_TIME = 2000;private int index = 0;private long exitTime = 0;//Handler導包為android.os.Handlerprivate Handler myhandler = new Handler() { @Overridepublic void handleMessage(Message msg) { switch (msg.what) { case AUTO_MSG: if (index == images.length) { index = 0; } vp.setCurrentItem(index++);//收到消息后設置當前要顯示的圖片myhandler.sendEmptyMessageDelayed(AUTO_MSG, 2000); break; default: break; } // super.handleMessage(msg);}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Toast.makeText(MainActivity.this, "1111", Toast.LENGTH_SHORT).show(); //圖片id //topmain_imags = (ImageView) findViewById(R.id.topmain_imags);vp = (ViewPager) findViewById(R.id.vp);for (int i = 0; i < images.length; i++) { iv2 = new ImageView(this); iv2.setImageResource(images[i]); views.add(iv2);}vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Overridepublic void onPageSelected(int position) { iv = (ImageView) MainActivity.this.findViewById(images2[position]); //iv.setImageResource(R.drawable.go_next);for (int i = 0; i < images2.length; i++) { if (i != position) { iv = (ImageView) MainActivity.this.findViewById(images2[i]); //iv.setImageResource(R.drawable.next_null);} } } @Overridepublic void onPageScrollStateChanged(int state) { }});myhandler.sendEmptyMessageDelayed(AUTO_MSG, 2000);//輪播圖片的適配器vp.setAdapter(new MyImageAdapter());//圖片的適配器class MyImageAdapter extends PagerAdapter { @Overridepublic int getCount() { return views.size(); } @Overridepublic Object instantiateItem(ViewGroup container, final int position) { View v = views.get(position); v.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { int i = position + 1; if (i == 1) { Intent intent = new Intent(); //給intent設置actionintent.setAction(Intent.ACTION_VIEW); //設置數據intent.setData(Uri.parse("http://www.xuexifangfa.com/xuexifangfa/135.html")); startActivity(intent); } if (i ==2) { Intent intent = new Intent(); //給intent設置actionintent.setAction(Intent.ACTION_VIEW); //設置數據intent.setData(Uri.parse("http://www.xuexifangfa.com/xuexifangfa/135.html")); startActivity(intent); } if (i ==3) { Intent intent = new Intent(); //給intent設置actionintent.setAction(Intent.ACTION_VIEW); //設置數據intent.setData(Uri.parse("http://www.xuexila.com/time/497904.html")); startActivity(intent); } if (i==4) { Intent intent = new Intent(); //給intent設置actionintent.setAction(Intent.ACTION_VIEW); //設置數據intent.setData(Uri.parse("http://www.xiaogushi.com/Article/chali/")); startActivity(intent); } // Toast.makeText(MainActivity.this, "這是第" + i + "張圖片", Toast.LENGTH_SHORT).show();} }); container.addView(v); return v; } @Overridepublic void destroyItem(ViewGroup container, int position, Object object) { View v = views.get(position); container.removeView(v); } @Overridepublic boolean isViewFromObject(View view, Object object) { return view == object; }}

xml:

<android.support.v4.view.ViewPagerandroid:id="@+id/vp"android:layout_width="match_parent"android:layout_height="80dp"/>

主頁面需顯示各個科目,考慮到需裝許多數據,便采用了ViewPager+Fragment 由于Fragment都是一樣的 這里我就只貼一個了,

先貼的是activity:

xml:

<android.support.v4.view.ViewPagerandroid:layout_width="wrap_content"android:layout_height="0dp"android:id="@+id/vp_viewpage_activity"android:layout_weight="1"></android.support.v4.view.ViewPager>

其對應的activity:

List<Fragment> view = new ArrayList<>();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到viewpager 課程的viewpagervp_viewpage_activity = (ViewPager) findViewById(R.id.vp_viewpage_activity);// 獲得對象集合view.add(new ChineseFragment());view.add(new MathFragment());view.add(new EnglishFragment());view.add(new HistoryFragment());view.add(new GeographyFragment());view.add(new LifeFragment());view.add(new ChemistryFragment());view.add(new GovermentFragment());view.add(new PhysicsFragment());//調用適配器vp_viewpage_activity.setAdapter(new Myadapter(getSupportFragmentManager()));//碎片的適配器class Myadapter extends FragmentPagerAdapter { public Myadapter(FragmentManager fm) { super(fm); } @Overridepublic Fragment getItem(int position) { return view.get(position); } @Overridepublic int getCount() { return view.size(); }}

碎片activity:

import android.content.Intent;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.example.activity_appui.R;import com.example.activity_appui.com.example.Chinese_famous_write;import com.example.activity_appui.com.example.Chinese_pager_up;import com.example.activity_appui.com.example.Chinese_reader;import com.example.activity_appui.com.example.Chinese_base;public class ChineseFragment extends Fragment { @Nullable @Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_chinese, null); view.findViewById(R.id.tv_chinese).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { // Toast.makeText(getContext(), "asdasd", Toast.LENGTH_SHORT).show();Intent intent=new Intent(getActivity(), Chinese_base.class); startActivity(intent); } }); view.findViewById(R.id.tv_chinese2).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { Intent intent=new Intent(getActivity(), Chinese_famous_write.class); startActivity(intent); } }); view.findViewById(R.id.tv_chinese3).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { Intent intent=new Intent(getActivity(), Chinese_pager_up.class); startActivity(intent); } }); view.findViewById(R.id.tv_chinese4).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) { Intent intent=new Intent(getActivity(), Chinese_reader.class); startActivity(intent); } }); return view; }}

xml就不貼了。

這里關于選中變顏色的問題:你只需在values下面的colors.xml里面設置就行了。

然后你開始點單元做題,比如你點擊語文做閱讀理解題,數據庫已經建好了關于語文分類表,你只需要給它設置一個監聽事件,然后寫個根據類別查詢的sql語句就行了。

之后就出現了相應的題目,對于做題,先是需要你選的答案需要與數據庫的答案相匹配。如果你的答案正確了便怎樣,錯了便怎樣。像我就是如果選擇正確了,便為綠色,錯了便為紅色。這個的話自己可以寫個選擇器引用就行了。

這樣便能實現一個答題的效果,同時還有一些其他的功能,像一般這樣的app都會有各種答題方式,如順序練習,章節練習,隨機練習等等……這些就不一一說了,這個只需修改sql語句,其實現的原理都是一樣的。最后想說的是要多勇敢的嘗試,不管難不難,都要去嘗試,只有嘗試了才有資格說難不難,要多給自己機會。還有就是需要思路清晰,把思路清晰了之后再下手,這樣效率更高。先寫到這,以后有機會再寫。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邯郸县| 高要市| 平乐县| 芦山县| 普宁市| 临夏市| 德惠市| 霍邱县| 麦盖提县| 山东| 周口市| 香港| 页游| 克山县| 韩城市| 杨浦区| 邯郸县| 镇宁| 七台河市| 开化县| 祁连县| 桂东县| 苏尼特左旗| 尼玛县| 昂仁县| 兰西县| 石狮市| 荣成市| 教育| 宣恩县| 邵东县| 苗栗县| 澄江县| 宜昌市| 从江县| 酒泉市| 寿宁县| 桓仁| 金坛市| 祁东县| 剑阁县|