show code block

2016年7月25日 星期一

Android原件:巢狀類別Dialog 和 Button的互動

Android原件:巢狀類別Dialog Button的互動


實作影片:




前言
請先下載我的github來參考。會比較清楚,一言之就是一個螢幕和Button之間的互動。
要怎麼作應用還是要靠您自己了。





實作

在使用彈跳對話視窗時,必須 IMPLEMENTS 這個內部方法implements DialogInterface.OnClickListener


public class MainActivity extends AppCompatActivity implements DialogInterface.OnClickListener {

   //螢幕
    private TextView m_tv_message;
    private int mChoice;

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

 init();
    }


   


  //螢幕
    private void init() {
        m_tv_message = (TextView) findViewById(R.id.message);
    }


    //Button1
    public void clickAlertDialog(View view) {
        new AlertDialog.Builder(this)
                .setMessage("你好帥喔")
                .setPositiveButton("I Know!", this)
                .setNegativeButton("hewe", this)
                .show();
    }

    //Button1 implments DialogInterface.OnClickListener 必須要override的方法
    @Override
    public void onClick(DialogInterface dialog, int which) {
        m_tv_message.setText("我知道");
    }


    //Button2 clickAlertDialogYesNo
    //因為MainActivity介面的DialogInterface.OnClickListenerButton1已經使用過了
    //所以在Button2我們在下面自己寫了一個方法
    //並寫入clcikAlertDialogYesNo
    public void clickAlertDialogYesNo(View view) {
//呼叫方法
        AlertDialogYesNoListener listener = new AlertDialogYesNoListener();
        new AlertDialog.Builder(this)
                .setMessage("你好帥喔")
                .setPositiveButton("謝謝", listener)
                .setNegativeButton("sfdsfa", listener)
                .show();
    }
    //Button2
    private class AlertDialogYesNoListener implements DialogInterface.OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    m_tv_message.setText("Thnks");
                    break;
                case DialogInterface.BUTTON_NEGATIVE:
                    m_tv_message.setText("狗腿");
                    break;
            }

        }
    }



    //Button3使用內部類別,直接把DialogInterface.OnClickListener這方法寫在內部
    //new DialogInterface.OnClickListener就是我們在Button2的時候寫在外面的方法
    public void Button3(View view) {
        new AlertDialog.Builder(this)
                .setMessage("選擇一二三")
                .setPositiveButton("hloOne", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                m_tv_message.setText("one");
                            }
                        }
                )
                .setNegativeButton("22222", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        m_tv_message.setText("two");
                    }
                })
                .setNeutralButton("threee", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        m_tv_message.setText("three");
                    }
                })
                .show();

    }



    //按下button4
    public void Button4(View view) {
        //建造陣列=strings.xml內的responsestring-array內的東西丟入
        final String[] response = getResources().getStringArray(R.array.response);
        new AlertDialog.Builder(this, android.R.style.Theme_Holo_Light_Dialog_NoActionBar)
                //這邊必須用setTitle,不能像上面三個Button一樣使用setMessage
                .setTitle("你好帥喔")
                //setItems的用法
                .setItems(response, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        m_tv_message.setText(response[which]);
                    }
                })
                .show();
   


    //Button5
    public void Button5(View view){
        final String[] response=getResources().getStringArray(R.array.response);
        final boolean[] selected=new boolean[response.length];//記錄每個選項的勾選狀態
        new AlertDialog.Builder(this)
                .setTitle("你好")
                 //MultiChoice是多選的用法
                .setMultiChoiceItems(response,selected,new DialogInterface.OnMultiChoiceClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
selected[which]=isChecked;
                    }
                })
                .setPositiveButton("OK",new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        StringBuilder result=new StringBuilder();
                        for(int i=0;i<selected.length;i++){

                            if(selected[i]){
                                result.append(response[i]).append("\n");

                            }

                        }
                        m_tv_message.setText(result);
                    }
                })
                .setNegativeButton("CANCEL",new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        m_tv_message.setText("無言");
                    }
                })
                .show();


    }

       //Button6
    public void Button6(View view){
final String[] response=getResources().getStringArray(R.array.response);
        new AlertDialog.Builder(this)
                .setTitle("你好帥")
                //Multi不同,這只能單選
                .setSingleChoiceItems(response,0,new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                       mChoice=which;
                    }
                })
                .setPositiveButton("OK",new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        m_tv_message.setText(response[mChoice]);
                    }
                })
                .setNegativeButton("Cancel",new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
m_tv_message.setText("hellono world" );
                    }
    })
                .show();

    }

}




values>strings.xml下加入字串,這是Button3-6會使用到的字串。
<string-array name="response">
    <item>
我知道</item>
    <item>
少狗腿</item>
    <item>
大家都那麼說</item>

</string-array>


GITHUB:

Android原件: ActionBar上面的OptionsMenu應用

今日影片示範:






前言

這也是App常使用到的功能,也是ActionBar上面的三個點。





實作

主要程式碼:
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 2, Menu.NONE, " 首頁");
        menu.add(0, 3, Menu.NONE, "哈囉");
        return super.onCreateOptionsMenu(menu);
    }

    //OptionMenu按下之後的反應
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 2:
                Toast.makeText(MainActivity.this, "首頁", Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
        }

        return super.onOptionsItemSelected(item);
    }


主要需要兩種overrride(onCreateOptionsMenuonOptionsItemSelected),可以按Alt+o 叫出。
OnCreateOptionsMenu中,設定你要出現的選擇文字
menu.add(0, 2, Menu.NONE, " 首頁");

onOptionsItemSelected中,使用switch設定你選擇文字後的反應。




Github:

2016年7月7日 星期四

更新App(拉皮、抽屜navigationDrawer)、R紅色錯誤(R檔不見了)

更新App UI 、 加了一些新功能






前言

前一個作品的UI介面實在太醜了!
想把作品弄的專業一點,自己就去收尋了抽屜NavigationView的做法。
效果真的蠻棒的!


我會開放我的github在下面,如果對作品有問題可以留言給我。


未來我會希望能創造一個會員系統!如果有所斬獲我會在放上來分享給大家!



小發現

最近我寫程式R會突然跑出紅字(setContentView(R.layout.activity_main);)

沒有R檔通常使用[Project]-->[Clean]

然後上網查的答案通常都會告訴你是GRADLE的問題、android studio重開就可以了之類的答案.....

然後我發現都沒有用!

之後靠我撞了好幾天的牆後發現,通常這種情況都是你的Layout出問題,但layout介面又不會跑出錯誤,當你要模擬按下run時,R就會出現轉為紅色,這時候就要在layout中努力找尋bug,通常她都會告訴你是哪一個java內的R出錯,只要找尋那一頁的layout就行了!





2016年7月4日 星期一

Android原件:取消ActionBar、ViewPager的應用

Android原件(actionbar、viewpager):取消ActionBarViewPager的應用



今日實做的影片效果:





 前言


基本上我是看這篇學的,如果有興趣可以參考一下原文:
原作者沒有附上檔案,我有附上github連結,如果有不懂可以下載下來看看。






重要程式碼:

Layout布局   >>>  PagerTabStrip是ViewPager下面那條橫槓
<android.support.v4.view.ViewPager  
 android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/pagertab"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        ></android.support.v4.view.PagerTabStrip>

</android.support.v4.view.ViewPager>


LayoutInflater填入layout,並且裝入陣列。(載入要顯示的View(Layout))


//設定inflater,並把view(layout)裝入inflater
LayoutInflater lf = getLayoutInflater().from(this);

view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);

//將要顯示的view裝入陣列
viewList = new ArrayList<View>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);


這是ViewPager的Adapter,在Activity直接設置它的Adapter,使用到Viewpager都需要重寫PagerAdapter。


//設定inflater,並把view(layout)裝入inflater
LayoutInflater lf = getLayoutInflater().from(this);

view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);

//將要顯示的view裝入陣列
viewList = new ArrayList<View>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);


完整實作:

重點是MainActivity。Layout1~3只要分的出三個的差異就行了。


Activity.java。
import android.content.Intent;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.PagerTitleStrip;
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.Button;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private View view1, view2, view3;//滑動的頁面
    private ViewPager viewPager;//viewpager
    private PagerTitleStrip pagerTitleStrip;//viewpager的標題
    private PagerTabStrip pagerTabStrip;//一個viewpager的指示器,效果就是一個橫的粗下滑線
    private List<View> viewList;
    private List<String> titleList;
    private Button webio_button;
    private Intent intent;

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

     //取消ActionBar
        getSupportActionBar().hide();
    }

    private void init() {

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);

        //橫粗下滑線 顏色
        pagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.colorPrimary));

        //?
        pagerTabStrip.setDrawFullUnderline(false);

        //背景顏色
        pagerTabStrip.setBackgroundColor(getResources().getColor(R.color.colorAccent));

        pagerTabStrip.setTextSpacing(100);


        /*精華處*/
        //設定inflater,並把view(layout)裝入inflater
        LayoutInflater lf = getLayoutInflater().from(this);

        view1 = lf.inflate(R.layout.layout1, null);
        view2 = lf.inflate(R.layout.layout2, null);
        view3 = lf.inflate(R.layout.layout3, null);

        //將要顯示的view裝入陣列
        viewList = new ArrayList<View>();
        viewList.add(view1);
        viewList.add(view2);
        viewList.add(view3);
        //每個介面的Title數據
        titleList = new ArrayList<String>();
        titleList.add("page One");
        titleList.add("page Two");
        titleList.add("page Three");

        /*精華處*/
        //viewpager  adapter轉接器 /*Important things 精華*/

        PagerAdapter pagerAdapter = new PagerAdapter() {

            @Override//要使用pagerAdapter必須要有的
            public boolean isViewFromObject(View arg0, Object arg1) {

                return arg0 == arg1;
            }

            @Override//ViewList數量
            public int getCount() {

                return viewList.size();
            }

            @Override//消滅View
            public void destroyItem(ViewGroup container, int position,
                                    Object object) {
                container.removeView(viewList.get(position));

            }

            @Override
            public int getItemPosition(Object object) {

                return super.getItemPosition(object);
            }

            @Override //Titlelist塞入
            public CharSequence getPageTitle(int position) {

                return titleList.get(position);

            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                container.addView(viewList.get(position));

                return viewList.get(position);
            }

        };
        viewPager.setAdapter(pagerAdapter);
    }





}




Activity布局。


<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"


    tools:context="com.example.nikeru8.app_viewpage.MainActivity">

    <android.support.v4.view.ViewPager
       android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pagertab"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            ></android.support.v4.view.PagerTabStrip>

    </android.support.v4.view.ViewPager>
</RelativeLayout>




另外三個Layout我是使用Fragment,在這就不贅述了。






















完成囉!

 在結尾順便強調一下取消actionbar這件事,畢竟只有一行....太容易被忽略了!

        getSupportActionBar().hide();

很重要的阿 各位! 


github:
https://github.com/nikeru8/app_viewpage




2016/12/21  微更

其實要消除ActionBar,只要把 extends  AppCompatActivity 

改成extends  Activity ActionBar就會自動消失。

有人問我,那為什麼還要有 getSupportActionBar().hide(); 這個方法呢?


因為ActivityAppCompatActivity他們上面繼承的東西部一樣,有些方法沒辦法在Activity內呼叫。








協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...