Android 學習

Android Studio學習

1.活動的基本用法

1.新建一個活動,會有主函數和其相對布局。

上面的圖片就是在setContenView()中添加我們自主創建的一個活動ID;

2.在AndroidMainfirst文件中注冊活動

? ? * **所有的活動都需要在AndroidMainfirst文件中進行注冊才能生效**,配置活動的方法:在的標簽內部加入標簽,并且在標簽里面添加

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

這串代碼相當于把fFirstActivity設置為主活動(即點擊桌面應用程序圖標時,打開的就是這個活動),打開一個空活動時,標題欄下面的就是在layout中編寫的界面。

3.在活動中使用Toast

? ? * 首先需要定義一個彈出Toast的觸發點,首先在layout中創建一個button按鈕,把這個按鈕當做Toast的觸發點,實現效果是:當你點擊button時,頁面會彈出一個提醒方式。

? ? * 在onCreate()方法中添加如下代碼:

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.first_layout);

Buttonbutton1=(Button)findViewById(R.id.button_1);

button1.setOnClickListener(newView.OnClickListener() {

publicvoidonClick(Viewv) {

Toast.makeText(FirstActivity.this,"you clicked button 1",

Toast.LENGTH_SHORT).show();

? ? ? ? ?? }

? ? ?? });

* 在活動中可以通過findViewByID()的方法來獲取到布局文件中定義的元素,首先需向下轉型把button變成Button的實例化對象。setOnClickListener()為按鈕注冊了一個監聽器,點擊按鈕就睡執行onClick中的功能。所以,彈出提示Toast的功能代碼就在onClick函數中書寫了。makeText方法中有三個參數,第一個是Context的對象,直接導入主活動就行;第二個參數是Toast中的顯示的內容;第三個參數是顯示時長,有兩個內置常量可以選擇,Toast.LENGTH_SHORE ?? Toast.LENGTH_LONG

4.在活動中使用菜單MENU

1.首先要在res目錄下面新建一個menu文件夾,然后在這個文件夾下面創建一個名為main的菜單文件。然后再main.xml中添加代碼:

<menuxmlns:android="http://schemas.android.com/apk/res/android">

<item

android:id="@+id/add_item"

android:title="Add"/>

<item

android:id="@+id/remove_item"

android:title="Remove"

/>

</menu>

這里創建了兩個菜單項,title就是給具體的菜單項一個標識符。創建完成后需要在返回FirstActivity中重寫onCreateOptionsMenu()和onOptionsItemSelected()方法

@Override

publicbooleanonCreateOptionsMenu(Menumenu) {

getMenuInflater().inflate(R.menu.main,menu);

returntrue;

}

@Override

publicbooleanonOptionsItemSelected(@NonNullMenuItemitem) {

switch(item.getItemId()) {

caseR.id.add_item:

Toast.makeText(this,"雪寶兒最美",

Toast.LENGTH_SHORT).show();

break;

caseR.id.remove_item:

Toast.makeText(this,"凱哥哥最帥",

Toast.LENGTH_SHORT).show();

break;

default:

?? }

returntrue;

}

onOptionsItemSelected()方法中定義的是菜單響應事件,item.getItemId()是用來判斷點擊的是哪一個具體的菜單事項,然后在每個菜單事項下面添加自己的邏輯代碼。

多種菜單的創建:

<?xmlversion="1.0"encoding="utf-8"?>

<menuxmlns:android="http://schemas.android.com/apk/res/android">

<item

android:title="listview效果顯示"

android:id="@+id/list_view">

<menu>

<item

android:title="垂直標準"

android:id="@+id/listview_vertical_stander">

</item>

<item

android:title="垂直反向"

android:id="@+id/listview_vertical_reverse">

</item>

</menu>

</item>

<item

android:title="grad_view效果顯示"

android:id="@+id/grad_view"

>

<menu>

<item

android:title="垂直標準"

android:id="@+id/gradview_vertical_stander">

</item>

<item

android:title="垂直反向"

android:id="@+id/gradview_vertical_reverse">

</item>

</menu>

</item>

<item

android:title="瀑布流效果顯示"

android:id="@+id/stagger_view"

>

<menu>

<item

android:title="垂直標準"

android:id="@+id/stagview_vertical_stander">

</item>

<item

android:title="垂直反向"

android:id="@+id/stagview_vertical_reverse">

</item>

</menu>

</item>

</menu>

onCreateOptionsMenu()和onOptionsItemSelected()方法與普通菜單方法無異,第一個是加載菜單(將菜單布局添加至主布局中),第二個方法用來添加菜單的事件,里面可以添加一些邏輯事件。

5.使用intent在各個活動中穿梭

首先需要創建一個新的活動,但是不要將其設置為主活動。個人比較喜歡用顯示intent,所以直接記錄顯示intent的用法。

首先先創建一個intent,傳入FirstActivity作為上下文,傳入ThirdActivity作為目標活動,然后通過startActivity(intent2)就可以執行這個intent了。

button1.setOnClickListener(newView.OnClickListener() {

publicvoidonClick(Viewv) {

Intentintent=newIntent(FirstActivity.this,ThirdActivity.class);

startActivity(intent2);

?? }

});

6.LinearLayout 布局文件模板:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

</LinearLayout>

7.修改APP名字和圖標

android:icon="@mipmap/app_fengmian"http://在這個里面修改圖標

android:label="@string/app_name"http://在這個里面修改名字

2.Ui開發控件知識

1.TextView

textview就是很簡單的文本顯示,在layout中編輯

android:id="@+id/text_view"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="hello world"

layout_width和layout_height制定了控件的寬度和高度,安卓中所有的控件都有這些屬性。match_parent指讓當前控件的大小和父布局一樣,也就是由父布局來決定當前控件的大小,wrap_content表示讓當前控件的大小能剛好包含其中的內容android:gravity="center"表示文字的對齊方式,指定center就是文字在水平和垂直方向上都是居中對齊的。至于字體的大小和顏色,自己考慮。

2.EditText

<EditText

android:id="@+id/editText1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="1dp"

android:layout_marginTop="0dp"/>

可以輸入內容,文本輸入框。

hint屬性就是一個比較高端的屬性,它可以在文本輸入框內顯示提示(在輸入內容之前),在輸入內容時,這個提示就會消失。

特殊屬性:singleLine 是單行輸入、inputtype是輸入類型,設置為textPassWord就是密碼類型,輸入的時候顯示安全鍵盤

賬號密碼匹配代碼:

3.ImageView

<ImageView

android:id="@+id/imageView2"

android:layout_width="149dp"

android:layout_height="222dp"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginLeft="100dp"

android:layout_marginTop="89dp"

android:layout_marginRight="100dp"

app:srcCompat="@drawable/jingerjie"/>

src屬性就是從drawle中調用圖片的,給ImageView指定了一張圖片

4.button

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button_1"

android:text="報君黃金臺上意,提攜玉龍為君死"

android:background="@android:color/transparent"

android:textSize="25sp"

android:textColor="#000000"

/>

尤其注意, android:background="@android:color/transparent"這串代碼可以讓按鈕的背景顏色改成透明,以后再軟件美化中可以用到

button按鈕的實現:

Buttonbutton=findViewByid(R.id.button_1);

button.setOnClickListener(newView.OnClickListemer(){

publicvoidonClick(Viewview) {


});

intent 跳轉的實現;

Intentintent3=newIntent(FirstActivity.this,ForthActivity.class);

startActivity(intent3);

1.拖動條(progressBar)

1.自己理解就是一個簡單的控件而已,至于進度條想什么時候走完沒所謂,反正是做假的。在.xml文件中直接定義就行

<ProgressBar

android:id="@+id/pb"

style="@android:style/Widget.ProgressBar.Horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:max="100"

android:progress="60"/>

android:max : 進度條的最大值

android:progress : 進度條的精度,自己定義的(所以我說都是假的)

android:indeterminate : 如果設置為true,就是不顯示進度條的精度

style : 就是設置進度條的樣式,是什么類型的,大或小,圓形或者水平(安卓自帶樣式)

2.實現一個進度條的進度(自動和手動兩種方式)

自動:

publicclassProgressBarActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateintcurrentProgress=0;

privateProgressBarprogressBar;

privateintmaxProgress;

privateHandlermHandler=newHandler(){

@Override

publicvoidhandleMessage(@NonNullMessagemsg) {

super.handleMessage(msg);

switch(msg.what){

case0:

progressBar.setProgress(currentProgress);

break;

? ? ? ? ?? }

? ? ?? }

?? };

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_progress_bar);

progressBar=findViewById(R.id.pb);

maxProgress=progressBar.getMax();

mtu_pb=findViewById(R.id.pb_mtu);

?? }

@Override

protectedvoidonStart() {

super.onStart();

newThread(){

@Override

publicvoidrun() {

while(true){

try{

for(inti=0;i<=100;i++){

Thread.sleep(1000);

currentProgress+=10;

if(currentProgress>maxProgress){

break;

? ? ? ? ? ? ? ? ? ? ? ? ?? }

mHandler.sendEmptyMessage(0);

? ? ? ? ? ? ? ? ? ? ?? }

}catch(InterruptedExceptione){

e.printStackTrace();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? }

? ? ? ? ?? }

}.start();

?? } ? ?

1.可以實現進度條的自動加載,運用多線程的相關知識;

手動:

publicclassProgressBarActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateProgressBarprogressBar_try;

privateButtonmtu_pb;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_progress_bar);

progressBar_try=findViewById(R.id.pb_try);

mtu_pb.setOnClickListener(this);

}

@Override

publicvoidonClick(Viewview) {

switch(view.getId()){

caseR.id.pb_mtu:

intprogress=progressBar_try.getProgress();

progress+=10;

progressBar_try.setProgress(progress);

break;

default:

break;

? ? ?? }

?? }

}

可以實現進度條的手動加載,按動一次按鈕,就可以實現進度條的一次加載,每次加載10%

2.拖動條seekbar

首先在layout布局文件中創建拖動條

<SeekBar

android:id="@+id/sb_norbal"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

<TextView

android:id="@+id/txt_cur"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:layout_gravity="center"

android:textSize="30sp"/>

<SeekBar

android:id="@+id/sb_custom"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:maxHeight="10dp"

android:maxWidth="5dp"

android:progressDrawable="@mipmap/fnegmain"

android:thumb="@color/colorPrimary"/>

android:progressDrawable是拖動條的樣式,可以放自己喜歡的圖片和背景;android:thumb是拖動后顯示的背景和顏色。

.java文件中,seekbar點擊事件有三個方法,第一個是進度條改變,第二個是點擊拖動條,第三個是松開進度條

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_seek_bar);

mContext=this;

sb_normal=findViewById(R.id.sb_norbal);

sb_custom=findViewById(R.id.sb_custom);

txt_cur=findViewById(R.id.txt_cur);

sb_normal.setOnSeekBarChangeListener(newSeekBar.OnSeekBarChangeListener() {

@Override

//第一個參數是seekbar的對象,第二個是進度條的值,第三個是是否進度條的值有改變

publicvoidonProgressChanged(SeekBarseekBar,inti,booleanb) {

txt_cur.setText("當前進度值: "+i+" / 100");

? ? ? ? ?? }

@Override

publicvoidonStartTrackingTouch(SeekBarseekBar) {

Toast.makeText(mContext,"觸碰SeekBar",Toast.LENGTH_SHORT).show();

? ? ? ? ?? }

@Override

publicvoidonStopTrackingTouch(SeekBarseekBar) {

Toast.makeText(mContext,"松開SeekBar",Toast.LENGTH_SHORT).show();

? ? ? ? ?? }

? ? ?? });

?? }

5.RadioGroup && RadioButton

RadioButton 實際上就是一個選框而已,不過如果沒有RadioGroup的存在,RadioButton可以進行多項選擇,但是如果存在RadioGroup的制約,它就從多選框變成了單選框。

RadioGrouprg=findViewById(R.id.radiugroup);

rg.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){

@Override

publicvoidonCheckedChanged(RadioGroupradioGroup,inti) {

switch(i){

caseR.id.button_1:

Log.d("onCheckedChanged","add");

Toast.makeText(ThirdActivity.this,"you clicked add",Toast.LENGTH_LONG).show();

break;

caseR.id.button_2:

Log.d("onCheckedChanged","delete");

Toast.makeText(ThirdActivity.this,"you clicked delete",Toast.LENGTH_LONG).show();

break;

default:

break;

? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? });

用法和button按鈕的基本一樣,只是在設置點擊事件的時候略有不同,自己注意體會。

RadioGroup && RadioButton的嵌套使用如下:

<RadioGroup

android:id="@+id/radiugroup"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

<RadioButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="delete"

android:textAllCaps="false"

android:textSize="30sp"

android:id="@+id/button_2">

</RadioButton>

<RadioButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="add"

android:textAllCaps="false"

android:textSize="30sp"

android:id="@+id/button_1">

</RadioButton>

</RadioGroup>

6..CheckBoxs復選框的實際應用

CheckBoxs是復選框,和RadioGroup && RadioButton沒什么太大的區別

<CheckBox

android:id="@+id/check_basket"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="籃球"/>

cb_basket=findViewById(R.id.check_basket);

cb_basket.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener() {

@Override

publicvoidonCheckedChanged(CompoundButtoncompoundButton,booleanb) {

Intentintent=newIntent(ThirdActivity.this,MainActivity.class);

startActivity(intent);

? ? ? ? ? }

? ? ? });

以上代碼就是在實際開發中對復選框的運用數據類型是boolean類型

7.對話框的實際應用

publicclassThirdActivityextendsAppCompatActivityimplementsView.OnClickListener{

Buttonbutton2=findViewById(R.id.button_adalog);

button2.setOnClickListener(this);

@Override

publicvoidonClick(Viewview) {

AlertDialog.Builderbuilder=newAlertDialog.Builder(ThirdActivity.this);

switch(view.getId()){

caseR.id.button_adalog:

builder.setTitle("對話框");

builder.setMessage("今晚喝酒嗎");

builder.setCancelable(false);

builder.setPositiveButton("走",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"你也配喝酒",

Toast.LENGTH_LONG).show();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? });

builder.setNegativeButton("不去,我要敲代碼",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"好小子!",Toast.LENGTH_LONG).show();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? });

break;

caseR.id.button_adalog2:

builder.setTitle("單選對話框");

builder.setIcon(R.mipmap.ic_launcher);

builder.setSingleChoiceItems(newString[]{

"好的,一起吧。","不,我要當廢物。","都行"

},0,newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"選中的",Toast.LENGTH_SHORT).show();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? });

break;

? ? ?? }

?? }

}

上述代碼是.java文件里面的所屬代碼,首先函數名不僅僅需要繼承AppCompatActivity,想要使用 AlertDialog,函數名還要繼承View.OnClickListener接口,然后在函數中覆寫onClick函數,以此表示按鈕的點擊事件。

在layout 布局文件中,則是直接創建一個按鈕即可。

onClick覆寫中,上述代碼使用switch-case語句是因為有單選對話框的存在,必須要判斷點擊的是那個按鈕,然后才能實現相關功。在對應的case語句下面編寫其邏輯代碼。

8.listview的使用

<ListView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:fastScrollEnabled="true"

android:id="@+id/lv_main">

</ListView>

首先需要創建一個布局,在里面添加一個listview,寬度高度自己調整,記得控件必須添加一個id

然后在.java文件中添加實現listview的代碼

publicclassListViewTryextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_list_view_try);

ListViewlv=findViewById(R.id.lv_main);

lv.setAdapter(newMyListViewAdapter());

?? }

publicclassMyListViewAdapterextendsBaseAdapter{

privateTextViewtv;

@Override

publicintgetCount() {

return100;

? ? ?? }

@Override

publicObjectgetItem(inti) {

returnnull;

? ? ?? }

@Override

publiclonggetItemId(inti) {

return0;

? ? ?? }

@Override

publicViewgetView(inti,Viewview,ViewGroupviewGroup) {

if(view==null){

tv=newTextView(ListViewTry.this);

? ? ? ? ?? }

else{

tv=(TextView)view;

? ? ? ? ?? }

tv.setText("蝌蚪!"+i);

returntv;

? ? ?? }

?? }

}

上述代碼用來實現listview效果,首先需要找到我們需要的控件ID,ListView lv = findViewById(R.id.lv_main);完成功能。然后需要向listview添加數據,這就需要自己建立一個數據類,讓他繼承BaseAdapter,繼承里面的方法,第一個方法public int getCount()是用來實現顯示幾行; public View getView方法是用來顯示listview中的文字。最后lv.setAdapter(new MyListViewAdapter());即可。

9.ScrollView及HorizontalScrollView

<?xmlversion="1.0"encoding="utf-8"?>

<ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".Scrollview"

android:orientation="vertical">

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="test1"

android:id="@+id/test1"/>

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="test2"

android:id="@+id/test2"/>


<HorizontalScrollView

android:layout_width="match_parent"

android:layout_height="wrap_content">

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content">

<Button

android:layout_width="200dp"

android:layout_height="200dp"

android:id="@+id/HScrollview1"

android:text="Htext1"/>

<Button

android:layout_width="200dp"

android:layout_height="200dp"

android:id="@+id/HScrollview2"

android:text="Htext2"/>

</LinearLayout>

</HorizontalScrollView>

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/text6"

android:text="the last text"

android:layout_marginTop="200dp"/>

</LinearLayout>

</ScrollView>

上述代碼可以知道兩種滾動布局的用法,ScrollView是主布局,直接作用在布局里面,而HorizontalScrollView布局則是作用在ScrollView中,是它的子布局,嵌套在其中。前者是垂直布局,后者是水平布局。但是需要注意,兩種布局下面都要用LinearLayout布局來實現,LinearLayout中可以添加控件

10.RecycleView 的使用

1.利用RecycleView實現listview

publicclassLinearRecycleViewActivityextendsAppCompatActivity{

privateRecyclerViewmyrcv;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_linear_recycle_view);

myrcv=findViewById(R.id.rv_main);

myrcv.setLayoutManager(newLinearLayoutManager(LinearRecycleViewActivity.this));

myrcv.setAdapter(newLinearAdapter(LinearRecycleViewActivity.this));

?? }

}

<androidx.recyclerview.widget.RecyclerView

android:id="@+id/rv_main"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

首先創建一個活動,在布局里面添加一個RecycleView。.java文件中找到所用的控件,然后設置一個布局管理器,最后設置一個數據適配器。

publicclassLinearAdapterextendsRecyclerView.Adapter<LinearAdapter.LinearViewHolder>{

privateContextmcontext;

publicLinearAdapter(Contextcontext){

this.mcontext=context;

?? }

@NonNull

@Override

publicLinearAdapter.LinearViewHolderonCreateViewHolder(@NonNullViewGroupparent,intviewType) {

returnnewLinearViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.linear_recycle,parent,false));

?? }

@Override

publicvoidonBindViewHolder(@NonNullLinearAdapter.LinearViewHolderholder,finalintposition) {

holder.textview.setText("hello kedou");

holder.itemView.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

Toast.makeText(mcontext,"you click the"+position,Toast.LENGTH_SHORT).show();

? ? ? ? ?? }

? ? ?? });

?? }

@Override

publicintgetItemCount() {

return100;

?? }

classLinearViewHolderextendsRecyclerView.ViewHolder{

privateTextViewtextview;

publicLinearViewHolder(ViewitemView){

super(itemView);

textview=itemView.findViewById(R.id.tv_title);

? ? ?? }

?? }

}

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="蝌蚪"

android:id="@+id/tv_title"

android:gravity="center"

android:textSize="20sp"

android:textColor="#000000"

android:background="@drawable/abc_vector_test"/>? ?

首先創建一個布局文件,此布局文件中添加一個想要在RecycleView中顯示的控件。在.java文件中,數據適配器需要繼承RecycleView的適配器,然后繼承相關方法。 onCreateViewHolder方法用來創建一個ViewHolder的實例,onBindViewHolder方法用來綁定布局,可以在里面添加一些邏輯事件(設置文字,顯示彈窗之類的),getItemCount方法用來返回列表的長度。class LinearViewHolder extends RecyclerView.ViewHolder是用來滿足適配器的泛型事件。

11Fragment的使用

1.靜態加載fragment

publicclassMyfragmentextendsFragment{

@Nullable

@Override

publicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState) {

//第七行代碼是用來加載布局的主要代碼

Viewview=inflater.inflate(R.layout.activity_myfragment,container,false);

returnview;

?? }

}

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

<fragment

android:name="com.example.frag1.Fragment.Myfragment"

android:id="@+id/myfragment"

android:layout_width="match_parent"

android:layout_height="300dp"/>

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="300dp"

android:layout_marginTop="30dp"

android:id="@+id/rl_fragment"/>

</LinearLayout>

靜態加載碎片,其實是非常簡單的,首先需要創建一個活動,這個類必須繼承Fragment。在這個活動下面的布局里面就可以寫想要在碎片中加載的東西,可以在里面添加一些簡單的控件,在.java文件中,需要public View onCreateView方法來實現碎片的加載,具體請看上述代碼。然后在主函數的布局中添加一個標簽fragment,作為容器,直接運行即可加載碎片。

2.動態加載碎片

首先創建一個活動作為主活動,在主活動的布局文件中添加一個FragLayout,作為所有碎片的容器。

<FrameLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_below="@id/ly_top_bar"

android:layout_above="@id/div_tab_bar"

android:id="@+id/ly_content1"

android:background="@android:color/transparent">

</FrameLayout>

然后創建其他活動,在其布局文件中添加自己想要的效果,在其.java文件中重寫View onCreateView方法表示添加布局。

主活動需要寫碎片的實現:

privatevoidreplacefragemnt(MyFragment_tishimyFragment_tishi){

FragmentManagerfragmentManager=getSupportFragmentManager();

FragmentTransactiontransaction=fragmentManager.beginTransaction();

//尤為重要的是,第五行的代碼,碎片的被代替布局必須是在主函數中自己寫的碎片容器,代替者是代替函數中活動的對象。

transaction.replace(R.id.ly_content1,myFragment_tishi);

transaction.commit();

?? }

//下面這串代碼可以添加在邏輯事件中,調用replace方法,實現碎片的動態添加

replacefragemnt(newMyFragment_tishi());


* 首先自定義一個代替方法,是將碎片中原有的事物代替成為一個新的事物(新的事物就是自己寫的幾個活動),然后在點擊事件中調用自定義的代替方法,碎片的動態添加就可以完成。

## 3.存儲數據

### 1.SharedPreferences數據存儲

* ``` java

? Button button2 = findViewById(R.id.button2);

? ? ? ?? button2.setOnClickListener(new View.OnClickListener(){

? ? ? ? ? ?? public void onClick(View v){

? ? ? ? ? ? ? ?? SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();

? ? ? ? ? ? ? ?? editor.putString("name","tom");

? ? ? ? ? ? ? ?? editor.putInt("age",20);

? ? ? ? ? ? ? ?? editor.putBoolean("married",false);

? ? ? ? ? ? ? ?? editor.apply();

? ? ? ? ? ?? }

? ? ? ?? });

button按鈕邏輯中實現數據的存儲

調用SharedPreferences對象的edit方法來獲取haredPreferences.Editor對象,然后向該對象中添加數據,添加完畢后通過apply方法將數據提交,完成數據的存儲。

3.數據的存儲

1.從SharedPreferences讀取數據

此代碼布局文件中使用了chrckBox復選框記住密碼來實現功能操作。

privateSharedPreferencespref;

privateSharedPreferences.Editoreditor;

privateCheckBoxremember;

Buttonbutton=findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

Stringeditone=edit1.getText().toString();

Stringedittwo=edit2.getText().toString();

if(editone.equals("2373704672")&&edittwo.equals("lxswwy.1314")){

editor=pref.edit();

if(remember.isChecked()){

editor.putBoolean("remember password",true);

editor.putString("account:",editone);

editor.putString("password:",edittwo);

}else{

editor.clear();

? ? ? ? ? ? ? ? ? }

editor.apply();

Intentintent=newIntent(MainActivity.this,FirstActivity.class);

startActivity(intent);

finish();

? ? ? ? ? ? ? }

else{

Toast.makeText(MainActivity.this,"賬號或密碼輸入有誤",Toast.LENGTH_LONG).show();

? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? });

按鈕中實現自動存入密碼功能

2.數據庫SQLIte

SQLiteOpenHelper的其中一個使用比較多的構造方法中,里面有四個參數,第一個是context,第二個是數據庫的名字,第三個是查詢數據時返回一個自定義的Cursor,一般都是傳入null,最后一個是版本號。

首先新建一個類,繼承SQLiteOpenHelper

publicclassMyDatabaseHelperextendsSQLiteOpenHelper{

publicstaticfinalStringCREATE_BOOK="create tabke Book("

+"id integer primary key autoincrement,"

+"author text,"

+"price real,"

+"pages integer,"

+"name text)";

privateContextmContext;

publicMyDatabaseHelper(@NullableContextcontext,@NullableStringname,@NullableSQLiteDatabase.CursorFactoryfactory,intversion) {

super(context,name,factory,version);

mContext=context;

?? }

@Override

publicvoidonCreate(SQLiteDatabasesqLiteDatabase) {

sqLiteDatabase.execSQL(CREATE_BOOK);

Toast.makeText(mContext,"create successed",Toast.LENGTH_SHORT).show();

?? }

@Override

publicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,intoldVersion,intnewVersion) {

?? }

}

然后在主函數中加以實現

privateMyDatabaseHelperdbhelper;

dbhelper=newMyDatabaseHelper(this,"BookStore.db",null,1);

Buttonbutton=findViewById(R.id.button_sql);

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

dbhelper.getWritableDatabase();

? ? ? ? ?? }

? ? ?? });

上述代碼是以按鈕為操作連接,然后實現數據庫的創建。

4.多媒體使用

1.通知的實現:

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener

finalintNOTIFYID=0x123;

privateButtonmybtu;

@RequiresApi(api=Build.VERSION_CODES.JELLY_BEAN)

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mybtu=findViewById(R.id.btu_inform);

mybtu.setOnClickListener(this);

?? }

@RequiresApi(api=Build.VERSION_CODES.JELLY_BEAN)

@Override

publicvoidonClick(Viewview) {

switch(view.getId()){

caseR.id.btu_inform:

finalNotificationManagernotificationManager=

(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

// 創建一個Notification對象

Notification.Buildernotification=newNotification.Builder(this);

// 設置打開該通知,該通知自動消失

notification.setAutoCancel(true);

// 設置通知的圖標

notification.setSmallIcon(R.mipmap.ic_launcher);

// 設置通知內容的標題

notification.setContentTitle("哈哈哈哈哈哈");

// 設置通知內容

notification.setContentText("點擊查看詳情!");

//設置使用系統默認的聲音、默認震動

notification.setDefaults(Notification.DEFAULT_SOUND

|Notification.DEFAULT_VIBRATE);

//設置發送時間

notification.setWhen(System.currentTimeMillis());

// 創建一個啟動其他Activity的Intent

Intentintent=newIntent(MainActivity.this

,DetailActivity.class);

PendingIntentpi=PendingIntent.getActivity(

MainActivity.this,0,intent,0);

//設置通知欄點擊跳轉

notification.setContentIntent(pi);

//發送通知

notificationManager.notify(NOTIFYID,notification.build());

break;

default:

break;

? ? ?? }

?? }

}

上述代碼已經有很明確的注解,此處不做闡釋。DetailActivity是點擊通知后跳轉的頁面.?

2.攝像頭拍照

xml文件:

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity"

android:orientation="vertical">

<Button

android:id="@+id/take_photo"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="take photo"

android:textAllCaps="false">

</Button>

<ImageView

android:id="@+id/picture"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center">

</ImageView>

</LinearLayout>

// .java文件

publicclassMainActivityextendsAppCompatActivity{

publicstaticfinalintTAKE_PHOTO=1;

privateImageViewPICTURE;

privateUriimageUri;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButtontakePhoto=findViewById(R.id.take_photo);

PICTURE=findViewById(R.id.picture);

takePhoto.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

FileoutputImage=newFile(getExternalCacheDir(),"output_image.jpg");

try{

if(outputImage.exists()){

outputImage.delete();

? ? ? ? ? ? ? ? ?? }

outputImage.createNewFile();

}catch(IOExceptione){

e.printStackTrace();

? ? ? ? ? ? ?? }

if(Build.VERSION.SDK_INT>=24){

imageUri=FileProvider.getUriForFile(MainActivity.this,

"com.example.cameraalbumtest.fileprovider",

outputImage);

}else{

imageUri=Uri.fromFile(outputImage);

? ? ? ? ? ? ?? }

//啟動相機程序

Intentintent=newIntent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

startActivityForResult(intent,TAKE_PHOTO);

? ? ? ? ?? }

? ? ?? });

?? }

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,@NullableIntentdata) {

switch(requestCode){

caseTAKE_PHOTO:

if(requestCode==RESULT_OK){

try{

//將拍攝的照片顯示出來

Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));

PICTURE.setImageBitmap(bitmap);

}catch(FileNotFoundExceptione){

e.printStackTrace();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? }

break;

default:

break;

? ? ?? }

?? }

}

調取系統相冊

新增一個方法

publicvoidopenGallery() {

Intentintent=newIntent(Intent.ACTION_PICK);

intent.setType("image/*");

startActivityForResult(intent,CROP_PHOTO);

?? }

把按鈕的點擊事件改為:

@Override

publicvoidonClick(Viewv) {

switch(v.getId()) {

caseR.id.take_photo:

//openCamera(this);

openGallery();

break;

? ? ?? }

?? }

因為這里請求碼為CROP_PHOTO,因此對上邊的CROP_PHOTO做些改造

@Override

publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata) {

switch(requestCode) {

caseTAKE_PHOTO:

? ? ? ? ? ? ?? ...

break;

caseCROP_PHOTO:

if(resultCode==RESULT_OK) {

try{

if(data!=null) {

Uriuri=data.getData();

imageUri=uri;

? ? ? ? ? ? ? ? ? ? ?? }

Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver()

.openInputStream(imageUri));

picture.setImageBitmap(bitmap);

}catch(FileNotFoundExceptione) {

e.printStackTrace();

? ? ? ? ? ? ? ? ?? }

? ? ? ? ? ? ?? }

break;

default:

super.onActivityResult(requestCode,resultCode,data);

break;

? ? ?? }

?? }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容