안드로이드 소프트 키보드 숨기기

반응형

View view = this.getCurrentFocus();

if (view != null) {  

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

}



반응형

댓글()

HttpURLConnection 을 이용해서 http status code 받아 오기

프로그래밍/Android (Java)|2020. 12. 21. 10:16
반응형

아래와 같은 내용으로 접근하려는 웹서버의 http status code 를 확인 할 수 있습니다.


StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);


URL url;

HttpURLConnection connection = null;


try {

    url = new URL("http://sysdocu.tistory.com");

    connection = (HttpURLConnection) url.openConnection();

    Toast.makeText (DetailsActivity.this, "응답 결과 : " + connection.getResponseCode(), Toast.LENGTH_SHORT).show();

} catch (IOException e) {

    e.printStackTrace();

} finally {

    if (connection != null) {

        connection.disconnect();

    }

}



반응형

댓글()

안드로이드 진동 기능 사용하기

프로그래밍/Android (Java)|2020. 12. 18. 15:34
반응형

진동 효과를 사용하기 위한 권한과 시간 설정만 하면 간단히 사용이 가능합니다.


1. AndroidManifest.xml

<uses-permission android:name="android.permission.VIBRATE"/>


2. MainActivity.java

특정한 패턴으로 반복 동작하고 싶은 경우 아래와 같이 사용하면 됩니다.


Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

long[] to_long = {0,  // 0초 대기, 2초 진동, 1초 대기, 2초 진동... 반복 (총 1분)

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000};다.

vibrator.vibrate(to_long, -1);  // 0 은 반복, -1 는 반복 안함


취소 방법

vibrator.cancel();

반응형

댓글()

안드로이드 모든 TextView, Button 폰트 일괄 변경 (Custom Font)

프로그래밍/Android (Java)|2020. 12. 18. 12:41
반응형

안드로이드 앱 내의 모든 TextView 나 Button 폰트를 일괄적으로 변경, 적용하려면 다음과 같이 진행합니다.



1. 폰트 저장


res/font 디렉토리 내에 ttf 파일을 저장합니다.


예) nanumgothicbold.ttf



2. 스타일 설정


values/style.xml 파일 또는 themes/themes.xml 파일 수정


<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="Theme.Sysdocu" parent="Theme.MaterialComponents.DayNight.DarkActionBar">

        <item name="colorPrimary">@color/purple_500</item>

        <item name="colorPrimaryVariant">@color/purple_700</item>

        <item name="colorOnPrimary">@color/white</item>

        <item name="colorSecondary">@color/teal_200</item>

        <item name="colorSecondaryVariant">@color/teal_700</item>

        <item name="colorOnSecondary">@color/black</item>

        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>


        <!-- 아래 정의 해놓은 폰트 적용 -->

        <item name="android:textViewStyle">@style/nanumTextView</item>

        <item name="android:buttonStyle">@style/nanumButton</item>


    </style>


    <style name="nanumTextView" parent="android:Widget.TextView">

        <item name="android:fontFamily">@font/nanumgothicbold</item>

    </style>


    <style name="nanumButton" parent="android:Widget.Button">

        <item name="android:fontFamily">@font/nanumgothicbold</item>

    </style>


</resources>


이제 빌드 후 확인해보면, TextView 와 Button 에서 사용하는 폰트는 자동 적용된 것을 볼 수 있습니다.




반응형

댓글()

Android RecyclerView + ItemTouchHelper - 드래그 앤 드롭, 스와이프

프로그래밍/Android (Java)|2020. 12. 18. 08:45
반응형

* 참고

아래 소스대로 구현시 Activity 에서 item 값을 가져오고 싶을 경우에 사용 하면 됩니다.


String aa = ((TextView) mRecyclerView.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.tv_name)).getText().toString();


* 1 : array 번호

* name : tab_item.xml 에서 가져올 요소 이름


주의할 점은, 화면을 벗어난 item 의 정보를 가져올 경우 null 값이 반환 되어 오류가 발생됩니다.

그럴땐 아래와 같이 사용하면 됩니다.


for(int i = 0; i<Objects.requireNonNull(mRecyclerView.getAdapter()).getItemCount(); i++) {

            if (mRecyclerView.findViewHolderForLayoutPosition(i) != null) {

                View childView = Objects.requireNonNull(mRecyclerView.findViewHolderForLayoutPosition(i)).itemView;

                TextView tv_name = childView.findViewById(R.id.tv_name);

                String name = tv_name.getText().toString();

                Toast.makeText(getBaseContext(), "아이템 NAME : " + name, Toast.LENGTH_SHORT).show();

            }

        }




그럼 살펴보도록 합니다.




[출처] https://jroomstudio.tistory.com/27


RecyclerView + ItemTouchHelper -> Drag and Drop과 swipe 구현 

 

실행화면

 

자바 클래스 및 인터페이스

 

레이아웃

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
        android:id="@+id/rv_tab_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@layout/tab_item"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
 
 

tools:listitem -> 리사이클러뷰에 추가 될 레이아웃을 지정한다. 

 

tab_item.xml -> 추가될 아이템 레이아웃 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="60dp"
    android:orientation="horizontal"
    android:paddingEnd="20dp"
    android:paddingStart="20dp">
 
 
    <TextView
        android:id="@+id/name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:textColor="@android:color/primary_text_light"
        android:textSize="20sp"
        android:text="TAB NAME" />
 
 
    <FrameLayout
        android:id="@+id/drag_handle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_gravity="center"
            android:src="@drawable/ic_drag_handle" />
    </FrameLayout>
 
</LinearLayout>
 
 

 

아이템 레이아웃

TabItem.java 모델

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class TabItem {
 
    private String name;
    private int number;
 
    public TabItem(String name, int number){
        this.name = name;
        this.number = number;
    }
 
    public int getNumber() {
        return number;
    }
 
    public void setNumber(int number) {
        this.number = number;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
 
 

아이템 레이아웃에 셋팅 될 Tab name과 리스트 순번을 모델 객체가 저장하고 반환한다. 

  

ItemTouchHelperListener.java 인터페이스

1
2
3
4
public interface ItemTouchHelperListener {
    boolean onItemMove(int form_position, int to_position);
    void onItemSwipe(int position);
}
 
 

RecylcerView의 Adapter 클래스에서 상속받는다. 

onItemMove -> 아이템의 현재 위치와 이동 위치를 입력받아 아이템 리스트에의 위치를 수정하도록 구현 

onItemSwipe -> 아이템의 포지션값을 받아 해당 아이템을 Swipe할때 로직을 구현 

 

ItemTouchHelperCallback.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
 
    private ItemTouchHelperListener listener;
 
    public ItemTouchHelperCallback(ItemTouchHelperListener listener) { this.listener = listener; }
 
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView,
                                @NonNull RecyclerView.ViewHolder viewHolder) {
        int drag_flags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
        int swipe_flasg = ItemTouchHelper.START|ItemTouchHelper.END;
        return makeMovementFlags(drag_flags,swipe_flasg);
/* 참고하실 부분은 onMove와 onSwipe중 하나만 사용하겠다라고 하신다면 getMovementFlags에서 return을 해주는 makeMovementFlags함수의 인자로 0을 넣어주시면 됩니다. 예를 들면, onMove만 사용(onSwipe 사용안함) - return makeMovementFlags(drag_flags,0); onSwipe만 사용(onMove 사용안함) - return makeMovementFlags(0,swipe_flags); 출처: https://everyshare.tistory.com/27 [에브리셰어] */
    }
 
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
                          @NonNull RecyclerView.ViewHolder viewHolder,
                          @NonNull RecyclerView.ViewHolder target) {
        return listener.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
    }
 
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        listener.onItemSwipe(viewHolder.getAdapterPosition());
    }
 
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

ItemTouchHelperCallback 생성자

-> 해당 클래스를 생성할 때 ItemTouchHelperListener를 입력받아 멤버 인스턴스로 지정하고 ItemTouchHelper.Callback이 지원하는 여러 메소드를 오버라이딩 하여 필요에 따라 사용한 후  결과값들을 반환해 준다.  아이템 위치변경 , 스와이프 , 롱클릭 등 다양한 기능을 지원한다.  

getMovementFlags

-> 리사이클러뷰와 리사이클러뷰 뷰홀더를 입력받는다.

-> drag 위치와 swipe 위치를 ItemTouchHelper에서 받아 셋팅한다.

-> makeMovementFlags() 메소드로 drag위치와 swipe 위치를 입력하여 현재 위치값을 int로 반환해준다.  

onMove

-> 리사이클러뷰,viewHolder, target(viewHolder 중 선택된 아이템)을 입력받아 움직임을 감지한다. 

-> ItemTouchHelperListener의 onItemMove메소드로 해당 아이템의 움직임을 감지한다.

-> onItemMove 메소드는 아이템이 움직이고 있는 가를 판별하고 boolean 값으로 반환한다.  

onSwiped

-> 리사이클러뷰의 뷰홀더와 움직일 방향을 입력받는다.

-> ItemTouchHelperListner의 onItemSwipe메소드에 움직일 방향을 입력하여 swipe를 구현한다.  

isLongPressDragEnabled() 

-> true를 반환하도록 설정하면 롱클릭을 감지한다. 

 

TabListAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class TabListAdapter extends RecyclerView.Adapter<TabListAdapter.ItemViewHolder>
                            implements ItemTouchHelperListener{
 
    private ArrayList<TabItem> items = new ArrayList<>();
 
    public TabListAdapter(){}
 
    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.tab_item, parent, false);
        return new ItemViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    public void setItems(ArrayList<TabItem> itemList){
        items = itemList;
        notifyDataSetChanged();
    }
 
    @Override
    public boolean onItemMove(int form_position, int to_position) {
        TabItem item = items.get(form_position);
        items.add(to_position,item);
        item.setNumber(to_position);
        notifyItemMoved(form_position, to_position);
        return true;
    }
 
    @Override
    public void onItemSwipe(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }
 
    public class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tabName;
        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            tabName = itemView.findViewById(R.id.name);
        }
        public void onBind(TabItem item,int position){
            tabName.setText(item.getName());
            item.setNumber(position);
        }
    }
}
 
 

-> RecyclerView.Adapter 를 상속받는다.

Adapter에는 RecyclerView.ViewHolder를 상속받은 내부 클래스를 구현하고 제네릭으로 지정하여 상속받아야 한다.  

-> ItemTouchHelperListener를 상속받아 onItemMove과 onItemSwipe를 오버라이딩하여 행동을 구현해준다. 

-> TabItem 모델을 제네릭으로 지정한 ArrayList를 생성한다. 

--------------------------------------------------------------

RecyclerView 상속 오버라이딩 메소드 

onCreateViewHolder

-> 리사이클러뷰에 추가될 item 레이아웃을 연결한다. 

-> ItemViewHolder 클래스에 View(item레이아웃)를 입력한다. 

onBindViewHolder 

-> ItemViewHolder와 아이템의 리스트상 위치를 입력받는다. 

-> ItemViewHolder 내부에 구현한 onBind 메소드에 아이템 리스트에서 포지션값으로 아이템을 선택하여 입력한다. 

getItemCount

-> items의 전체 갯수 숫자를 반환한다.

setItems

-> 메인액티비티에서 TabItem 객체를 생성한 후에 리스트를 입력하여 어댑터의 멤버 items에 매치시킨다. 

-> notifyDataSetChanged메소드로 데이터가 셋팅되었음을 알린다. 

--------------------------------------------------------------

ItemTouchHelperListener 오버라이딩 메소드

onItemMove

-> 아이템의 리스트상 현재위치와 움직일 위치를 입력받느다.

-> 입력받은 값으로 아이템의 이동을 구현한다. 

-> notifyItemMoved 메소드로 데이터가 이동함을 알린다. 

 

onItemSwipe

-> 포지션값을 입력받는다.

-> 포지션값으로 아이템리스트의 해당 포지션 아이템을 삭제한다.

-> notifyItemRemoved 메소드로 데이터가 삭제되었음을 알린다. 

 

ItemViewHolder 클래스

ItemViewHolder

-> 아이템 레이아웃의 name TextView 와 연결한다. 

onBind

-> TabItem객체에 셋팅된 값으로 각각의 레이아웃에 셋팅 한다. 

 

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class MainActivity extends AppCompatActivity {
 
    private RecyclerView mRecyclerView;
    private TabListAdapter mAdapter;
    private ItemTouchHelper mItemTouchHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mRecyclerView = (RecyclerView) findViewById(R.id.rv_tab_list);
 
        LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext());
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(manager);
 
        mAdapter = new TabListAdapter();
        mRecyclerView.setAdapter(mAdapter);
 
        mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(mAdapter));
 
        mItemTouchHelper.attachToRecyclerView(mRecyclerView);
 
        ArrayList<TabItem> items = new ArrayList<>();
        TabItem item1 = new TabItem("SUBSCRIBE",0);
        TabItem item2 = new TabItem("BEST",0);
        TabItem item3 = new TabItem("MUSIC",0);
        TabItem item4 = new TabItem("SPORTS",0);
        TabItem item5 = new TabItem("GAME",0);
        TabItem item6 = new TabItem("MOVIE",0);
        TabItem item7 = new TabItem("NEWS",0);
        TabItem item8 = new TabItem("LIVE",0);
        items.add(item1);
        items.add(item2);
        items.add(item3);
        items.add(item4);
        items.add(item5);
        items.add(item6);
        items.add(item7);
        items.add(item8);
 
        mAdapter.setItems(items);
 
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

-> 리사이클러뷰를 생성한다.

-> 리사이클러뷰에 LinearLayoutManager를 활용해 속성을 지정한다. 

-> 리사이클러뷰에 TabListAdpater를 셋팅한다. 

-> 어댑터를 입력한 ItemTouchHelperCallback 클래스를 ItemTouchHelper 생성자에 입력하여 생성한다.

-> TouchHelper 의 attachToRecyclerView 메소드를 활용해 Touch를 구현할 리사이클러뷰를 연결한다. 

-> TabItem 을 제네릭으로 받는 ArrayList를 생성하고 임의의 값을 셋팅한다.

-> 어댑터의 setItems 메소드에 해당 ArrayList를 입력한다. 


[출처] https://jroomstudio.tistory.com/27





반응형

댓글()

activity 간 데이터 전달

프로그래밍/Android (Java)|2020. 12. 17. 10:20
반응형

[ 방법1 ]


보내는 Activity


Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);


받는 Activity


@Override

protected void onCreate(Bundle savedInstanceState) {

    Intent intent = getIntent();

    String value = intent.getStringExtra("key");

}


[출처] https://stackoverflow.com/questions/4186021/how-to-start-new-activity-on-button-click



[ 방법2 ]


Intent 사용 없이 전역 변수에 넣어 어느 Activity 에서든 쉽게 데이터를 공유하고 싶을 경우

아래 포스팅을 참고 합니다.


https://sysdocu.tistory.com/1053



반응형

댓글()

안드로이드 CDT (CountDownTimer) 반복 작업을 종료하는 두 가지 방법

프로그래밍/Android (Java)|2020. 12. 14. 13:55
반응형

경우에 따라 반복문 내에서 반복적으로 작업을 진행하다가 조건에 맞아 종료하기도 하고,

외부 버튼을 통해 종료해야 할 경우도 있습니다.

두 가지 경우에 대해 종료하는 방법입니다.

 

int TTL = 1;


CountDownTimer CDT = new CountDownTimer(1000 * 86400 * 365, 1000) {
            public void onTick(long millisUntilFinished) {
                    result.setText(TTL + "\n");
                    // 지금이 10번째였다면 반복 중지 (CDT 내에서 종료할 경우)
                    if (TTL == 11) {
                            cancel();
                    }
                    TTL = TTL + 1;
            }
            public void onFinish() {
                // CountDownTimer 반복문 종료시 실행할 구문
            }
}; 


// 밖에서 버튼이나 특정 이벤트를 통해 종료할 경우
CDT.cancel();

 

 

결과

 

1

2

3

4

5

6

7

8

9

10

 

반응형

댓글()

안드로이드 네트워크 연결 여부 확인하기

프로그래밍/Android (Java)|2020. 12. 14. 12:56
반응형

int status = NetworkStatus.getConnectivityStatus(getActivity().getApplicationContext());


        // 모바일이나 wifi 에 연결이 된 경우

        if (status == NetworkStatus.TYPE_MOBILE || status == NetworkStatus.TYPE_WIFI) {

            Toast.makeText (this, "Network connection success", Toast.LENGTH_SHORT).show();


        // 네트워크 연결이 되지 않은 경우

        } else {

            Toast.makeText (this, "Network connection failed", Toast.LENGTH_SHORT).show();

        } 



반응형

댓글()

[Android, Java] String 클래스에서의 특수문자 인식

프로그래밍/Android (Java)|2020. 12. 11. 12:50
반응형

1. []으로 싸주면 문자 자체로 인식하는 것들. 


*  ⇒ [*] 

+  ⇒ [+] 

$  ⇒ [$] 

|  ⇒ [|] 



2. \\를 붙여줘야 하는 것들. 


( ⇒ \\( 

) ⇒ \\) 

{ ⇒ \\{ 

} ⇒ \\} 

^ ⇒ \\^ 

[ ⇒ \\[ 

] ⇒ \\] 



3. 자바의 특수문자는 \을 쓴다. 


 " ⇒ \" 



4. 나머지 부호들은 괜찮은 듯 하다. 

확인된 것. 


! # % & @ ` : ; - . < > , ~ ' 


ex ) 위에 놈들 다 지워 보자. 


    String c = "!\"#$%&(){}@`*:+;-.<>,^~|'[]"; 

    c = c.replaceAll("!\"#[$]%&\\(\\)\\{\\}@`[*]:[+];-.<>,\\^~|'\\[\\]", ""); 



출처: https://lazli.tistory.com/47 [lazli's Programming]



반응형

댓글()

TextView 터치 이벤트 발생 시키기

프로그래밍/Android (Java)|2020. 12. 8. 08:53
반응형

TextView tv_close = (TextView) findViewById(R.id.tv_close);


tv_close.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View viewIn) {


        // 이벤트 내용 (Activity 종료)

        finish();


    }

});



반응형

댓글()

안드로이드 ArrayList 중복 제거하기

프로그래밍/Android (Java)|2020. 12. 4. 16:50
반응형

String[] goodsList = {"notebook", "TV", "monitor", "keyboard", "mouse", "TV", "monitor", "keyboard"};

ArrayList<String> arrayList = new ArrayList<>();


for(String item : goodsList){

    if(!arrayList.contains(item))

        arrayList.add(item);

}


System.out.println(arrayList);



결과 = [notebook, TV, monitor, keyboard, mouse]



[출처] https://lnsideout.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4-ArrayList-%EC%A4%91%EB%B3%B5%EC%A0%9C%EA%B1%B0-%EB%AA%A8%EB%93%A0%EB%B0%A9%EB%B2%95

반응형

댓글()