2018年9月28日 星期五

Android-Android Console 隱私權政策

20190316 新增隱私權規章來源:
(部分收費) FreePrivacyPolicy 如果有GPS、adMob...就需要額外加錢
(免費) 簡易版本
(免費) termly
(免費) getterms
除了 FreePrivacyPolicy 有憑證連結其餘需自行找地方存放


這幾天收到 Google 通知信
如下:













簡單來說
辛辛苦苦做出來的應用程式暫時不會出現在商店了

問題是以下到底是?
違反 Android 廣告 ID 的使用方式政策和開發人員發佈協議第 4.8 條的規定

可能有的問題 :
1 . 有新的問券調查












2 . 那就和我一樣沒有設定隱私政策連結
(os : 目前不提交隱私權政策網址這選項是...?)
















請到此連結創立關於您應用軟體對應憑證( 免費版本皆可 ):privacypolicies












填完內容後回出現此,並且將並且將此路徑貼至隱私政策連結即可












請務必好好保留此資料


參考資料:Privacypolicies

2018年9月16日 星期日

Android-換頁特效

各位在開發頁面過程中
一定多多少少聽到換頁、轉頁這樣的抱怨

能有啥麼特效可以呈現 ?
這是什麼使用者體驗 ?
一堆讓人滿頭問號的 What...

今天就來寫簡單的範例讓大家秒懂
此篇以左右滑動特效為例子

公式圖表 :
















先想 A 頁面位移量為多少
再想 B 頁面位移量為多少



















1 . 先創立 res/anim folder













2 . 建立特效
A頁面主頁滑至左底<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />
</set>
B頁面右底滑至主頁
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:duration="500"
    android:fromXDelta="100%p"
    android:toXDelta="0%p" />
</set>

3 . 立即將此風格套用在 Style.xml 上吧
<style name="transitionPage" style="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/open_in_from_right</item>
<item name="android:activityOpenExitAnimation">@anim/open_out_from_left</item>
<item name="android:activityCloseEnterAnimation">@anim/close_in_from_left</item>
<item name="android:activityCloseExitAnimation">@anim/close_out_from_right</item>
</style>

<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">    .
    .
    <item name="android:windowAnimationStyle">@style/transitionPage</item>    .
</style>

參考資料:设置Activity退出动画无效问题的解决

2018年9月15日 星期六

Android-如何用Kotlin簡易設定與監聽按鈕(Button)

想必各位大大從 Java 轉到 Kotlin 有極大的痛楚
此篇就以現在常遇到的狀況下做簡易的介紹

首先我們先把一般情況下的
先把頁面畫出來





















1 . activity_button.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns: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">

    <Button
        android:id="@+id/buttonTest"
        android:layout_width="88dp"
        android:layout_height="48dp"
        android:layout_marginBottom="232dp"
        android:layout_marginEnd="148dp"
        android:layout_marginStart="148dp"
        android:layout_marginTop="231dp"
        android:text="我是按鈕"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

重點來了
以下是 Java 寫法
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ButtonJavaActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnTest;

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

        btnTest = findViewById(R.id.buttonTest);
        btnTest.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonTest:
                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }
}

以下是 Kotlin 寫法 
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.Button
import android.widget.Toast

class ButtonActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var btnTest: Button;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_button)

        btnTest = findViewById(R.id.buttonTest);
        btnTest.setOnClickListener(this);
        
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.buttonTest -> {
                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show();
            }
            else -> {

            }
        }
    }
}

Android-新建專案畫面佈局確有問題

在新建專案時想必第一個想法是
直接執行就可以跑在模擬器上了阿

剛開始我也是這樣想
但是自從換電腦後
又是另一回事了
一開啟畫面時馬上出現

Render problem
-Failed to load AppCompat ActionBar with unknown error.

The following classes could not be instantiated:
- android.support.v7.widget.ActionBarContainer (Open Class, Show Exception, Clear Cache)
- android.support.v7.widget.ActionBarContextView (Open Class, Show Exception, Clear Cache)
- android.support.v7.app.WindowDecorActionBar (Open Class, Show Exception, Clear Cache)















看起來並不單純了
東翻西找後
結果發現直接把 Style 修改成
Base.Theme.AppCompat.Light.DarkActionBar













這樣就能順利進行下面的開發了

歡迎轉載,請記得註明出處。


Android-無法開啟 AndroidStudio 模擬器

不知道各位大大是否有在新的電腦安裝 AndroidStudio
無法開啟模擬器的尷尬情況
錯誤訊息為 :

Emulator: emulator: 
ERROR: x86 emulation currently requires hardware acceleration!

然後依照以下的步驟卻一樣的情況發生 :

1 . SDK Tool 下載 Intel X86 Emulator Accelerator(HAXM installer)
















2 . 然後去 Sdk -> extras -> intel -> Hardware_Accelerated_Execution_Manager
安裝 intelhaxm-android.exe















然後沒有動靜,也一樣會出現一樣的錯誤...



上網查才發現
這是 Intel 針對虛擬機的一個設定
Intel VT-d(Intel Virtualization Technology for Directed I/O)
提供虛擬機一個強大的平台
為了避免使用者沒真正的在使用
所以預設都是為關閉的狀態
所以開發者必須要自己去 BIOS 自行該改





















歡迎轉載,請註明出處。