Android

안드로이드 5기 2017년 강의 정리 2 (오준석의 생존코딩)

https://www.youtube.com/watch?v=MjtlPTUUL74&list=PLxTmPHxRH3VWSF7kMcsIaTglWUJZpWeQ9&index=1

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki

MyFirstAndroidApp5ki-master.zip

 

11일차 메모앱 AlertDialog, Custom Dialog, ContextMenu

11일차 은행앱 연습문제

12일차, 13일차 LifeCycle, 12일차 레이아웃 분기, SharedPreference, ADB

14일차 프래그먼트

14일차 프래그먼트 연습문제

15일차 Callback

16일차 ViewPager, TabLayout

16일차 ViewPager TabLayout 연습문제 풀이

16일차 프래그먼트 생성 패턴

17일차 API 날씨 API

17일차 Geo IP API

18일차 네이버API 실패

18일차 네이버 파파고 API

 


11일차 메모앱 AlertDialog, Custom Dialog, ContextMenu

 

# MemoActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/MemoActivity.java

# MemoAdapter.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/adapters/MemoAdapter.java

# activity_memo.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_memo.xml

# dialog_login.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/dialog_login.xml

 

 

# AlertDialog

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("확인");
builder.setMessage("정말 삭제하시겠습니까");
builder.setIcon(R.mipmap.ic_launcher);
// 긍정 버튼
builder.setPositiveButton("삭제", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        deleteMemo(info.id);
    }
});
// 부정 버튼
builder.setNegativeButton("취소", null);
builder.show();

 

#CustomDialog

private void showCustomDialog() {
    View view = LayoutInflater.from(this).inflate(R.layout.dialog_login, null, false);
    final EditText idEditText = (EditText) view.findViewById(R.id.id_edit);
    final EditText passWordEditText = (EditText) view.findViewById(R.id.password_edit);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("확인");
    builder.setMessage("정말 삭제하시겠습니까");
    builder.setIcon(R.mipmap.ic_launcher);
    builder.setPositiveButton("확인", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String id = idEditText.getText().toString();
            String pass = passWordEditText.getText().toString();
            Toast.makeText(MemoActivity.this, id + " " + pass, Toast.LENGTH_SHORT).show();
        }
    });
    builder.setNegativeButton("취소", null);
    builder.setView(view);
    builder.show();
}

 

# ContextMenu

protected void onCreate(Bundle savedInstanceState) {
    registerForContextMenu(mMemoListView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu_memo, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.action_delete:
            return true;
        case R.id.action_custom_dialog:
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

 

 

 


 

11일차 은행앱 연습문제

 

# BankActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/BankActivity.java

# OpenAccountActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/OpenAccountActivity.java

# AccountCheckActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/AccountCheckActivity.java

# AdminModeActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/AdminModeActivity.java

# Bank.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/managers/Bank.java

# activity_account_check.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_account_check.xml

# activity_account_check.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_account_check.xml

# activity_open_account.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_open_account.xml

# activity_admin_mode.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_admin_mode.xml

 

 


 

12일차, 13일차 LifeCycle, 12일차 레이아웃 분기, SharedPreference, ADB

 

# LifeCycleActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/LifeCycleActivity.java

# activity_life_cycle.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_life_cycle.xml

 

# shared-preferences (android developers)
https://developer.android.com/training/data-storage/shared-preferences

# Android 디버그 브리지(adb)
https://developer.android.com/studio/command-line/adb

 

 

# AndroidManifest.xml 에서 Activity 의 android:screenOrientation=”portrait” 로 지정하더라도 멀티 윈도우에서는 데이터 복원이 필요하다.
그러므로 onSaveInstanceState() 와 onRestoreInstanceState() 를 이용해서 데이터를 복원한다.

# EditText 는 화면이 회전될 때 id 가 지정되어 있다면 데이터가 복원되지만 id 가 지정되어 있지 않다면 데이터가 복원되지 않는다.

 

# 레이아웃 분기 (가로모드용 레이아웃 폴더 만들기)
layout 폴더를 만든다. (Orientation 을 landscape 로 지정)
그리고 activity_main.xml 파일을 layout-land 폴더에 복사한다.
그러면 가로모드일 때는 layout-land 폴더를 타게 된다.

 

 

public class LifeCycleActivity extends AppCompatActivity {

    private static final String TAG = LifeCycleActivity.class.getSimpleName();

    private TextView mScoreTextView;
    private int mScore = 0;

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

        mScoreTextView = (TextView) findViewById(R.id.score_text);

        Log.d(TAG, "onCreate: ");

        // 복원 여기도 되고 (null 체크 필요)
//        if (savedInstanceState != null) {
//            mScore = savedInstanceState.getInt("score");
//            setScore(mScore);
//        }

        // 읽어오기
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        mScore = sharedPreferences.getInt("score", 0);
        setScore(mScore);
    }

    // 복원 여기도 됨
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        // 복원 (null 체크 불필요)
        mScore = savedInstanceState.getInt("score");
        setScore(mScore);
    }

    private void setScore(int score) {
        mScoreTextView.setText("점수 : " + score);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");

        // 저장
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("score", mScore);
        editor.apply();     // 비동기 (async)
//        editor.commit()   // 동기 (sync)
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    // 인스턴스 상태 저장
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState: ");

        outState.putInt("score", mScore);
    }

    public void onClick(View view) {
        mScore += 100;
        setScore(mScore);
    }
}

 

 


 

14일차 프래그먼트

 

# Fragments (android development)
https://developer.android.com/guide/components/fragments#java

 

# LifeCycleFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/LifeCycleFragment.java

 

# ListViewExamActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ListViewExamActivity.java

# activity_list_view_exam.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_list_view_exam.xml

 

# ColorFragmentActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ColorFragmentActivity.java

# activity_color_fragment.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_color_fragment.xml

 

# ColorFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ColorFragment.java

# fragment_color.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/fragment_color.xml

 

 

public class LifeCycleFragment extends Fragment {

    // 빈 생성자가 필요, 파라미터를 가질 수 없다 (액티비티의 라이프사이클에 맞게 동작하게 하기 위해)
    public LifeCycleFragment() {
        // Required empty public constructor
    }

    // 액티비티에 붙을 때
    @Override
    public void onAttach(Context context) {
        // context : 액티비티
        super.onAttach(context);
    }

    // 프래그먼트가 생성될 때
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        // savedInstanceState 로 복원 처리 가능
        super.onCreate(savedInstanceState);
    }

    // 액티비티의 onCreate()에 해당 : 레이아웃 완성
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // savedInstanceState 로 복원 처리 가능

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_color, container, false);
    }

    // 액티비티가 실제로 생성된 직후 호출
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        // savedInstanceState 로 복원 처리 가능
        super.onActivityCreated(savedInstanceState);
    }


    // 뷰 소멸
    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    // 프래그먼트 소멸
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    // 액티비티에서 떨어 짐
    @Override
    public void onDetach() {
        super.onDetach();
    }
}

 

 

 

public class ColorFragmentActivity extends AppCompatActivity {

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

        // 프래그먼트 생성 세 가지 방법
        // XML에서 프래그먼트 가져오기
        ColorFragment colorFragment = (ColorFragment) getSupportFragmentManager().findFragmentById(R.id.color_frag);
        // 인수전달 1. 퍼블릭 메서드를 통한 인수 전달
        colorFragment.setColor(Color.BLUE);

        // 동적으로 프래그먼트 추가
        ColorFragment colorFragment2 = new ColorFragment();
        // 인수전달 2. Bundle을 setArguments에 전달하는 방법
        Bundle bundle = new Bundle();
        bundle.putInt("color", Color.YELLOW);
        bundle.putString("text", "글자");
        colorFragment2.setArguments(bundle);

        // 인수전달 3. 팩토리 패턴을 활용하여 생성과 동시에 전달
        ColorFragment colorFragment3 = ColorFragment.newInstance(Color.YELLOW);

        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, colorFragment2)
                .commit();

    }

    public void onClick(View view) {
        ColorFragment newColorFragment = new ColorFragment();
        int color = Color.YELLOW;
        newColorFragment.setColor(color);
        // 기존의 프래그먼트를 교체
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, newColorFragment)
                .commit();
    }
}

 

public class ColorFragment extends Fragment {

    private int mColor = Color.WHITE;

    // 필수
    public ColorFragment() {
    }

    public static ColorFragment newInstance(int color) {
        ColorFragment colorFragment = new ColorFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("color", color);
        colorFragment.setArguments(bundle);
        return colorFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_color, container, false);

        Bundle bundle = getArguments();
        int color = bundle.getInt("color");
        mColor = color;
        view.setBackgroundColor(mColor);

        return view;
    }

    public void setColor(int color) {
        mColor = color;
        if (getView() != null) {
            getView().setBackgroundColor(mColor);
        }
    }
}

 

 

 

 


 

14일차 프래그먼트 연습문제

 

# FragmentExam1Activity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/FragmentExam1Activity.java

# activity_fragment_exam1.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_fragment_exam1.xml

# ColorFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ColorFragment.java

# TextFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/TextFragment.java

 

public class FragmentExam1Activity extends AppCompatActivity {

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

    private void addFragment(int containerId, int color, String text) {
        TextFragment textFragment = new TextFragment();
        textFragment.setColor(color);

        getSupportFragmentManager().beginTransaction()
                .add(containerId, textFragment)
                .commit();

        textFragment.setText(text);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                addFragment(R.id.container_1, Color.RED, "1번 프래그먼트");
                break;
            case R.id.button2:
                addFragment(R.id.container_2, Color.BLUE, "2번 프래그먼트");
                break;
            case R.id.button3:
                addFragment(R.id.container_3, Color.YELLOW, "3번 프래그먼트");
                break;
        }
    }
}

 

 

public class ColorFragment extends Fragment {

    private int mColor = Color.WHITE;

    // 필수
    public ColorFragment() {
    }

    public static ColorFragment newInstance(int color) {
        ColorFragment colorFragment = new ColorFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("color", color);
        colorFragment.setArguments(bundle);
        return colorFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_color, container, false);

        Bundle bundle = getArguments();
        int color = bundle.getInt("color");
        mColor = color;
        view.setBackgroundColor(mColor);

        return view;
    }

    public void setColor(int color) {
        mColor = color;
        if (getView() != null) {
            getView().setBackgroundColor(mColor);
        }
    }
}

 

 

public class TextFragment extends ColorFragment {

    private String mText = "";
    private TextView mTextView;

    public TextFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        mTextView = (TextView) view.findViewById(R.id.text_text);
        mTextView.setText(mText);
        return view;
    }

    public void setText(String text) {
        mText = text;

        if (mTextView != null) {
            mTextView.setText(mText);
        }
    }
}

 

# activity_fragment_exam1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_fragment_exam1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.myapplication.activities.FragmentExam1Activity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClick"
            android:text="Button" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClick"
            android:text="Button" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClick"
            android:text="Button" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/container_1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/container_2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/container_3"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

 

 


 

15일차 Callback

 

# Communicate with other fragments
https://developer.android.com/training/basics/fragments/communicating#java

 

# ImageFragmentActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ImageFragmentActivity.java

# ImageFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ImageFragment.java

 

public class MainActivity extends AppCompatActivity implements ImageFragment.OnImageTouchListener {

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

        ImageFragment imageFragment = (ImageFragment) getSupportFragmentManager().findFragmentById(R.id.image_frag);
        imageFragment.setOnImageTouchListener(this);
    }

    @Override
    public void onImageTouch(ImageView view, String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

 

public class ImageFragment extends Fragment {

    private OnImageTouchListener mListener;
    private ImageView mImageView;

    public interface OnImageTouchListener {
        void onImageTouch(ImageView view, String message);
    }

    public void setOnImageTouchListener(OnImageTouchListener listener) {
        mListener = listener;
        getView().setOnClickListener(v -> {
            if (mListener != null) {
                mListener.onImageTouch(mImageView, "임의의 데이터");
            }
        });
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        mImageView = (ImageView) view.findViewById(R.id.image_view);

        return view;
    }
}

 

 

 


 

16일차 ViewPager, TabLayout

 

# Slide between fragments using ViewPager2
https://developer.android.com/training/animation/screen-slide-2#java

 

# ViewPagerActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ViewPagerActivity.java

# activity_view_pager.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_view_pager.xml

# fragments/ColorFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ColorFragment.java

# fragment_color.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/fragment_color.xml

# drawable/selector_tab_background.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/drawable/selector_tab_background.xml

 

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_weather"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabBackground="@drawable/selector_tab_background"
        app:tabIndicatorColor="@android:color/white"
        app:tabSelectedTextColor="#ffea00"
        app:tabTextColor="#ffffff" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

# drawable/selector_tab_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false">
        <color android:color="?attr/colorPrimary" />
    </item>

    <item android:state_selected="true">
        <color android:color="@android:color/white" />
    </item>
</selector>

 

# fragment_color.xml

<FrameLayout 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">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/text_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="안녕하세요" />

</FrameLayout>

 

 

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private TabLayout mTabLayout;

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

        mTabLayout = (TabLayout) findViewById(R.id.tab);
        mViewPager = (ViewPager) findViewById(R.id.pager);

        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(adapter);

        mTabLayout.setupWithViewPager(mViewPager);
    }

    private static class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return ColorFragment.newInstance(Color.RED);
                case 1:
                    return ColorFragment.newInstance(Color.BLUE);
                case 2:
                    return ColorFragment.newInstance(Color.YELLOW);
                case 3:
                    return ColorFragment.newInstance(Color.CYAN);
                case 4:
                    return ColorFragment.newInstance(Color.MAGENTA);
            }
            return null;
        }

        @Override
        public int getCount() {
            return 5;
        }

        // 제목 표시
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "빨강";
                case 1:
                    return "블루";
                case 2:
                    return "노랑";
                case 3:
                    return "약간 푸른계열";
                case 4:
                    return "보라";
            }
            return null;
        }
    }
}

 

 

public class ColorFragment extends Fragment {

    private int mColor = Color.WHITE;

    // 필수
    public ColorFragment() {
    }

    public static ColorFragment newInstance(int color) {
        ColorFragment colorFragment = new ColorFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("color", color);
        colorFragment.setArguments(bundle);
        return colorFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_color, container, false);

        Bundle bundle = getArguments();
        int color = bundle.getInt("color");
        mColor = color;
        view.setBackgroundColor(mColor);

        return view;
    }

    public void setColor(int color) {
        mColor = color;
        if (getView() != null) {
            getView().setBackgroundColor(mColor);
        }
    }
}

 

 


 

16일차 ViewPager TabLayout 연습문제 풀이

 

# ViewPagerExamActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ViewPagerExamActivity.java

# ListViewFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ListViewFragment.java

# activity_view_pager_exam.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_view_pager_exam.xml

# fragment_list_view.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/fragment_list_view.xml

 

 

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private TabLayout mTabLayout;

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

        mTabLayout = (TabLayout) findViewById(R.id.tab);
        mViewPager = (ViewPager) findViewById(R.id.pager);

        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(adapter);

        mTabLayout.setupWithViewPager(mViewPager);
    }

    private static class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return ColorFragment.newInstance(Color.RED);
                case 1:
                    return ColorFragment.newInstance(Color.BLUE);
                case 2:
                    return ColorFragment.newInstance(Color.YELLOW);
                case 3:
                    return ColorFragment.newInstance(Color.CYAN);
                case 4:
                    return ColorFragment.newInstance(Color.MAGENTA);
            }
            return null;
        }

        @Override
        public int getCount() {
            return 5;
        }

        // 제목 표시
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "빨강";
                case 1:
                    return "블루";
                case 2:
                    return "노랑";
                case 3:
                    return "약간 푸른계열";
                case 4:
                    return "보라";
            }
            return null;
        }
    }
}

 

 

public class ListViewFragment extends Fragment {

    private List<String> mData;

    public static ListViewFragment newInstance(List<String> data) {
        ListViewFragment fragment = new ListViewFragment();

        Bundle bundle = new Bundle();
        bundle.putSerializable("data", (Serializable) data);

        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_list_view, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ListView listView = (ListView) view.findViewById(R.id.list_view);

        Bundle bundle = getArguments();
        mData = (List<String>) bundle.getSerializable("data");

        MyAdapter adapter = new MyAdapter(mData);

        listView.setAdapter(adapter);
    }

    private static class MyAdapter extends BaseAdapter {

        private final List<String> mmData;

        public MyAdapter(List<String> data) {
            mmData = data;
        }

        @Override
        public int getCount() {
            return mmData.size();
        }

        @Override
        public Object getItem(int position) {
            return mmData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                viewHolder = new ViewHolder();

                convertView = LayoutInflater.from(parent.getContext())
                        .inflate(android.R.layout.simple_list_item_1, parent, false);

                viewHolder.textView = (TextView) convertView.findViewById(android.R.id.text1);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            String data = mmData.get(position);

            viewHolder.textView.setText(data);

            return convertView;
        }
    }

    private static class ViewHolder {
        TextView textView;
    }
}

 

# activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_view_pager_exam"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

# fragment_list_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

 


 

16일차 프래그먼트 생성 패턴

 

# ColorFragment.java

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/ColorFragment.java

# ColorFragmentActivity.java

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/ColorFragmentActivity.java

 

public class ColorFragmentActivity extends AppCompatActivity {

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

        // 프래그먼트 생성 세 가지 방법
        // XML에서 프래그먼트 가져오기
        ColorFragment colorFragment = (ColorFragment) getSupportFragmentManager().findFragmentById(R.id.color_frag);
        // 인수전달 1. 퍼블릭 메서드를 통한 인수 전달
        colorFragment.setColor(Color.BLUE);

        // 동적으로 프래그먼트 추가
        ColorFragment colorFragment2 = new ColorFragment();
        // 인수전달 2. Bundle을 setArguments에 전달하는 방법
        Bundle bundle = new Bundle();
        bundle.putInt("color", Color.YELLOW);
        bundle.putString("text", "글자");
        colorFragment2.setArguments(bundle);

        // 인수전달 3. 팩토리 패턴을 활용하여 생성과 동시에 전달
        ColorFragment colorFragment3 = ColorFragment.newInstance(Color.YELLOW);

        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, colorFragment2)
                .commit();

    }

    public void onClick(View view) {
        ColorFragment newColorFragment = new ColorFragment();
        int color = Color.YELLOW;
        newColorFragment.setColor(color);
        // 기존의 프래그먼트를 교체
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, newColorFragment)
                .commit();
    }
}

 

 

public class ColorFragment extends Fragment {

    private int mColor = Color.WHITE;

    // 필수
    public ColorFragment() {
    }

    public static ColorFragment newInstance(int color) {
        ColorFragment colorFragment = new ColorFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("color", color);
        colorFragment.setArguments(bundle);
        return colorFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_color, container, false);

        Bundle bundle = getArguments();
        int color = bundle.getInt("color");
        mColor = color;
        view.setBackgroundColor(mColor);

        return view;
    }

    public void setColor(int color) {
        mColor = color;
        if (getView() != null) {
            getView().setBackgroundColor(mColor);
        }
    }
}

 

 


 

17일차 API 날씨 API

 

https://square.github.io/retrofit/

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

 

# WeatherApiActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/WeatherApiActivity.java

# WeatherFragment.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/fragments/WeatherFragment.java

# Weather.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/models/Weather.java

# WeatherAdapter.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/adapters/WeatherAdapter.java

# item_weather.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/item_weather.xml

# WeatherApi.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/interfaces/WeatherApi.java

# fragment_list_view.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/fragment_list_view.xml

# activity_weather_api.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_weather_api.xml

 

public class Weather {
    private int imageRes;
    private String weather;
    private String country;
    private String temperature;

    public Weather(int imageRes, String country, String temperature) {
        this.imageRes = imageRes;
        this.country = country;
        this.temperature = temperature;
    }

    public int getImageRes() {
        return imageRes;
    }

    public void setImageRes(int imageRes) {
        this.imageRes = imageRes;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getTemperature() {
        return temperature;
    }

    public void setTemperature(String temperature) {
        this.temperature = temperature;
    }

    public String getWeather() {
        return weather;
    }

    public void setWeather(String weather) {
        this.weather = weather;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Weather{");
        sb.append("country='").append(country).append('\'');
        sb.append(", imageRes=").append(imageRes);
        sb.append(", weather='").append(weather).append('\'');
        sb.append(", temperature='").append(temperature).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

 

 

public class WeatherAdapter extends BaseAdapter {
    private static final String TAG = WeatherAdapter.class.getSimpleName();
    private Context mContext;
    private List<Weather> mData;

    public WeatherAdapter(Context context, List<Weather> data) {
        mContext = context;
        mData = data;
    }

    // 아이템 갯수
    @Override
    public int getCount() {
        return mData.size();
    }

    // position번째 아이템
    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    // postion번째 id
    @Override
    public long getItemId(int position) {
        return position;
    }

    // position번째의 레이아웃
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        // convertView : 재사용 되는 뷰
        if (convertView == null) {
            viewHolder = new ViewHolder();

            // 뷰를 새로 만들 때
            convertView = LayoutInflater.from(mContext)
                    .inflate(R.layout.item_weather, parent, false);

            // 레이아웃 들고 오기
            ImageView imageView = (ImageView) convertView.findViewById(R.id.weather_image);
            TextView locationTextView = (TextView) convertView.findViewById(R.id.location_text);
            TextView temperatureTextView = (TextView) convertView.findViewById(R.id.temperature_text);

            // 뷰 홀더에 넣는다
            viewHolder.weatherImage = imageView;
            viewHolder.locationTextView = locationTextView;
            viewHolder.temperatureTextView = temperatureTextView;

            convertView.setTag(viewHolder);
        } else {
            // 재사용 할 때
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Log.d(TAG, "getView: " + position);

        // 데이터
        Weather weather = mData.get(position);

        // 화면에 뿌리기
        viewHolder.weatherImage.setImageResource(weather.getImageRes());
        viewHolder.locationTextView.setText(weather.getCountry());
        viewHolder.temperatureTextView.setText(weather.getTemperature());

        // 홀수 줄은 빨간 색
        if (position % 2 == 1) {
            convertView.setBackgroundColor(Color.RED);
        } else {
            convertView.setBackgroundColor(Color.WHITE);
        }

        // 클릭 된 아이템이면 노란색
        if (mSeletedPosition == position) {
            convertView.setBackgroundColor(Color.YELLOW);
        }

        return convertView;
    }

    // -1이면 선택된게 없다
    private int mSeletedPosition = -1;

    public void setSelect(int position) {
        mSeletedPosition = position;
    }

    // findViewById로 가져온 View 들을 보관
    private static class ViewHolder {
        ImageView weatherImage;
        TextView locationTextView;
        TextView temperatureTextView;
    }
}

 

 

public interface WeatherApi {

    String BASE_URL = "https://gist.githubusercontent.com/junsuk5/6b293ac781b038366419ac6e4027abb7/raw/b30deab47a9d2fd04247d9d912df3a9a4f7be8a9/";

    @GET("weather.json")
    Call<List<Weather>> getWeatherList();
}

 

 

public class WeatherApiActivity extends AppCompatActivity {

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

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(WeatherApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        WeatherApi weatherApi = retrofit.create(WeatherApi.class);

        weatherApi.getWeatherList().enqueue(new Callback<List<Weather>>() {
            @Override
            public void onResponse(Call<List<Weather>> call, Response<List<Weather>> response) {

                // 날씨 데이터
                List<Weather> weatherList = response.body();
                Log.d("Weather", "onResponse: " + weatherList);

                WeatherFragment fragment = WeatherFragment.newInstance(weatherList);

                getSupportFragmentManager().beginTransaction()
                        .add(R.id.container, fragment)
                        .commit();
            }

            @Override
            public void onFailure(Call<List<Weather>> call, Throwable t) {
                Toast.makeText(WeatherApiActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

 

 

public class WeatherFragment extends Fragment {

    private List<Weather> mWeatherList;

    public WeatherFragment() {
    }

    public static WeatherFragment newInstance(List<Weather> weatherList) {
        WeatherFragment fragment = new WeatherFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("data", (Serializable) weatherList);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_list_view, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mWeatherList = (List<Weather>) getArguments().getSerializable("data");
        ListView listView = (ListView) view.findViewById(R.id.list_view);
        WeatherAdapter adapter = new WeatherAdapter(getActivity(), mWeatherList);

        listView.setAdapter(adapter);
    }
}

 

# activity_weather_api.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_weather_api"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

 

# fragment_list_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

# item_weather.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:id="@+id/weather_image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/location_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="지역"
            android:textSize="36sp" />

        <TextView
            android:id="@+id/temperature_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:text="기온"
            android:textSize="24sp" />
    </LinearLayout>

</LinearLayout>

 

 


 

17일차 API Geo IP API

 

  1. 구글맵 Activity 를 추가한다.
  2. res/values/google_maps.api.xml 파일을 연다.
  3. 링크를 따라가서 api 키를 받아서 붙여넣기 한다.
  4. 핵심 코드들을 내 activity 에 붙여넣기 한다.

 

https://developer.android.com/training/maps

 

https://developers.google.com/maps/documentation/android-sdk/start

 

# GeoIpActivity.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/GeoIpActivity.java

# GeoIp.java
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/models/GeoIp.java

# activity_geo_ip.xml
https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_geo_ip.xml

 

 

public class GeoIpActivity extends AppCompatActivity implements View.OnClickListener, OnMapReadyCallback {

    private GoogleMap mMap;

    private EditText mAddressEditText;
    private TextView mResultTextView;

    private Retrofit mRetrofit;
    private FreeGeoIpService mService;

    private ProgressBar mProgressBar;

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(37.274105, 127.02262100000007);
        mMap.addMarker(new MarkerOptions().position(sydney).title("수원스마트앱개발학원"));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(17));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    interface FreeGeoIpService {
        @GET("json/{address}")
        Call<GeoIp> getGeoIp(@Path("address") String address);
    }

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

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        mRetrofit = new Retrofit.Builder()
                .baseUrl("http://freegeoip.net/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mService = mRetrofit.create(FreeGeoIpService.class);

        mAddressEditText = (EditText) findViewById(R.id.address_edit);
        mResultTextView = (TextView) findViewById(R.id.result_text);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);

        findViewById(R.id.submit_button).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mProgressBar.setVisibility(View.VISIBLE);

        // http://freegeoip.net/json/[mAddressEditText]
        mService.getGeoIp(mAddressEditText.getText().toString())
                .enqueue(new Callback<GeoIp>() {
                    @Override
                    public void onResponse(Call<GeoIp> call, Response<GeoIp> response) {
                        GeoIp geoIp = response.body();

                        if (geoIp != null) {
                            mResultTextView.setText(geoIp.toString());

                            // 지도에 반영
                            String city = geoIp.getCity();      // 도시 이름
                            String lat = geoIp.getLatitude();   // 위도
                            String lng = geoIp.getLongitude();  // 경도

                            LatLng latLng = new LatLng(Double.parseDouble(lat), Double.parseDouble(lng));
                            mMap.addMarker(new MarkerOptions().position(latLng).title(city));
                            mMap.animateCamera(CameraUpdateFactory.zoomTo(17));
                            mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                        } else {
                            Toast.makeText(GeoIpActivity.this, "잘못된 입력입니다", Toast.LENGTH_SHORT).show();
                        }

                        mProgressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onFailure(Call<GeoIp> call, Throwable t) {
                        Toast.makeText(GeoIpActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
                        mProgressBar.setVisibility(View.GONE);
                    }
                });
    }
}

 

 

public class GeoIp {
    private String time_zone;

    private String region_name;

    private String metro_code;

    private String zip_code;

    private String region_code;

    private String longitude;

    private String latitude;

    private String country_code;

    private String country_name;

    private String city;

    private String ip;

    public String getTime_zone() {
        return time_zone;
    }

    public void setTime_zone(String time_zone) {
        this.time_zone = time_zone;
    }

    public String getRegion_name() {
        return region_name;
    }

    public void setRegion_name(String region_name) {
        this.region_name = region_name;
    }

    public String getMetro_code() {
        return metro_code;
    }

    public void setMetro_code(String metro_code) {
        this.metro_code = metro_code;
    }

    public String getZip_code() {
        return zip_code;
    }

    public void setZip_code(String zip_code) {
        this.zip_code = zip_code;
    }

    public String getRegion_code() {
        return region_code;
    }

    public void setRegion_code(String region_code) {
        this.region_code = region_code;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getCountry_code() {
        return country_code;
    }

    public void setCountry_code(String country_code) {
        this.country_code = country_code;
    }

    public String getCountry_name() {
        return country_name;
    }

    public void setCountry_name(String country_name) {
        this.country_name = country_name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    @Override
    public String toString() {
        return "ClassPojo [time_zone = " + time_zone + ", region_name = " + region_name + ", metro_code = " + metro_code + ", zip_code = " + zip_code + ", region_code = " + region_code + ", longitude = " + longitude + ", latitude = " + latitude + ", country_code = " + country_code + ", country_name = " + country_name + ", city = " + city + ", ip = " + ip + "]";
    }
}

 

# activity_geo_ip.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_geo_ip"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/address_edit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="IP 또는 웹 주소" />

        <Button
            android:id="@+id/submit_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="실행" />

    </LinearLayout>

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

 

 


 

18일차 네이버API 실패

 

# 파파고 번역 API
https://developers.naver.com/docs/papago/papago-nmt-api-reference.md

# Get raw HTTP response with Retrofit (stackoverflow)
https://stackoverflow.com/questions/33282889/get-raw-http-response-with-retrofit

 

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/java/com/example/myapplication/activities/NaverTranslateApiActivity.java

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/layout/activity_naver_translate_api.xml

https://github.com/suwonsmartapp/MyFirstAndroidApp5ki/blob/master/app/src/main/res/values/arrays.xml

 

 

public class NaverTranslateApiActivity extends AppCompatActivity implements Callback<NaverTranslateApiActivity.Result> {

    private EditText mTextEditText;
    private Spinner mStartLangSpinner;
    private Spinner mEndLangSpinner;
    private TextView mResultTextView;

    public static final String BASE_URL = "https://openapi.naver.com/v1/language/translate/";

    public static class Result {
        public String translatedText;
    }

    interface NaverTranslateApi {
        @POST("/")
        Call<Result> getTraslatedText(@Field("X-Naver-Client-Id") String id,
                                      @Field("X-Naver-Client-Secret") String secret,
                                      @Field("source") String source,
                                      @Field("target") String target,
                                      @Field("text") String text);
    }

    private NaverTranslateApi mNaverTranslateApi;

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

        mTextEditText = (EditText) findViewById(R.id.text_edit);
        mStartLangSpinner = (Spinner) findViewById(R.id.start_lang_spinner);
        mEndLangSpinner = (Spinner) findViewById(R.id.end_lang_spinner);
        mResultTextView = (TextView) findViewById(R.id.result_text);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mNaverTranslateApi = retrofit.create(NaverTranslateApi.class);
    }

    public void onClick(View view) {
        String text = mTextEditText.getText().toString();
        String startLang = (String) mStartLangSpinner.getSelectedItem();
        String endLang = (String) mEndLangSpinner.getSelectedItem();

        Log.d("Naver", "onClick: " + startLang + ", " + endLang);

        Call<Result> call = mNaverTranslateApi.getTraslatedText("nv979wOPyCtzR1Cs6wQp",
                "LdLrwYGZvA",
                startLang,
                endLang,
                text);

        call.enqueue(this);
    }

    @Override
    public void onResponse(Call<Result> call, Response<Result> response) {
        mResultTextView.setText(response.body().translatedText);
    }

    @Override
    public void onFailure(Call<Result> call, Throwable t) {
        Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

 

# activity_naver_translate_api.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_naver_translate_api"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/text_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="번역할 문장" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Spinner
            android:id="@+id/start_lang_spinner"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:entries="@array/lang" />

        <Spinner
            android:id="@+id/end_lang_spinner"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:entries="@array/lang" />


    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="번역" />

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

 

# values/array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="lang">
        <item>ko</item>
        <item>en</item>
        <item>ja</item>
        <item>zh-CN</item>
    </string-array>
</resources>

 

 


 

18일차 네이버 파파고 API

 

public class NaverTranslateApiActivity extends AppCompatActivity implements Callback<NaverTranslateApiActivity.MyResult> {

    private EditText mTextEditText;
    private Spinner mStartLangSpinner;
    private Spinner mEndLangSpinner;
    private TextView mResultTextView;

    public static final String BASE_URL = "https://openapi.naver.com/v1/papago/";

    public static class MyResult {
        public Message message;
    }

    public static class Message {
        @SerializedName("@type")
        public String type;
        @SerializedName("@service")
        public String service;
        @SerializedName("@version")
        public String version;
        public Result result;
    }

    public static class Result {
        public String srcLangType;
        public String tarLangType;
        public String translatedText;
        public String engineType;
        public String pivot;
    }

    public interface NaverTranslateApi {
        @FormUrlEncoded
        @Headers({
            "X-Naver-Client-Id: ...",
                "X-Naver-Client-Secret: ..."
        })
        @POST("n2mt")
        Call<MyResult> getTraslatedText(
                @Field("source") String source,
                @Field("target") String target,
                @Field("text") String text);
    }

    private NaverTranslateApi mNaverTranslateApi;

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

        mTextEditText = (EditText) findViewById(R.id.text_edit);
        mStartLangSpinner = (Spinner) findViewById(R.id.start_lang_spinner);
        mEndLangSpinner = (Spinner) findViewById(R.id.end_lang_spinner);
        mResultTextView = (TextView) findViewById(R.id.result_text);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mNaverTranslateApi = retrofit.create(NaverTranslateApi.class);
    }

    public void onClick(View view) {
        String text = mTextEditText.getText().toString();
        String startLang = (String) mStartLangSpinner.getSelectedItem();
        String endLang = (String) mEndLangSpinner.getSelectedItem();

        Log.d("Naver", "onClick: " + startLang + ", " + endLang);

        Call<MyResult> call = mNaverTranslateApi.getTraslatedText(
                startLang,
                endLang,
                text);

        call.enqueue(this);
    }

    @Override
    public void onResponse(Call<MyResult> call, Response<MyResult> response) {
        mResultTextView.setText(response.body().message.result.translatedText);
    }

    @Override
    public void onFailure(Call<MyResult> call, Throwable t) {
        Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

 

 

Related posts

Leave a Comment