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

반응형

댓글()

앱 프로세스 완전 종료하기

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

안드로이드 앱은 액티비티의 집합으로 이루어져 있다. 생명주기도 액티비티마다 제각각이고 시작시점과 종료시점도 때로는 불분명한 것이 안드로이드의 현 주소이다. 가장 단순한 시나리오인 앱의 종료에 있어서도 생각할 것이 많다. 액티비티만 종료를 한다면 앱의 프로세스가 살아 있어서 예기치 못한 부작용이 나타나기도 하고, 앱의 프로세스만 종료하면 Task List에 앱이 여전히 남아있는 등, 다양한 문제가 나타난다.

여러 가지 실험 결과 앱을 완전히 종료하기 위해서는 다음의 스텝을 따라야 한다는 것을 깨달아서 남겨본다. 태스크를 백그라운드로 이동 -> 액티비티 종료 -> Task List에서 지우기 -> 앱 프로세스 종료. 이 중 하나만 빠져도 예기치 못한 상황이 발생한다. 아직까지는 이 방법으로 문제가 없는데, 앞으로도 문제가 없길 바라면서...

앱을 완전 종료하는 방법:

moveTaskToBack(true);						// 태스크를 백그라운드로 이동
finishAndRemoveTask();						// 액티비티 종료 + 태스크 리스트에서 지우기
android.os.Process.killProcess(android.os.Process.myPid());	// 앱 프로세스 종료

혹시 태스크 리스트에 앱이 남기를 원하는 경우는 다음과 같이 하면 된다:

moveTaskToBack(true);
finish();
android.os.Process.killProcess(android.os.Process.myPid());

혹시 액티비티만 죽이고, 프로세스는 계속 실행하려면 다음과 같이 한다:

moveTaskToBack(true);
finishAndRemoveTask();

Fin.


[출처] https://calvinjmkim.tistory.com/21



반응형

댓글()

adb shell 을 통한 명령어 실행하기

프로그래밍/Android (Java)|2020. 11. 27. 09:41
반응형

public class MainActivity extends Activity {


    TextView tv;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv=(TextView)findViewById(R.id.cmdOp);

        tv.setText("Output :"+"\n"+runAsRoot());

    }


    public String runAsRoot() {


        try {

            // Executes the command.

            Process process = Runtime.getRuntime().exec("ls -l");


            // Reads stdout.

            // NOTE: You can write to stdin of the command using

            //       process.getOutputStream().

            BufferedReader reader = new BufferedReader(

                    new InputStreamReader(process.getInputStream()));


            int read;

            char[] buffer = new char[4096];

            StringBuffer output = new StringBuffer();

            while ((read = reader.read(buffer)) > 0) {

                output.append(buffer, 0, read);

            }

            reader.close();


            // Waits for the command to finish.

            process.waitFor();


            return output.toString();

        } catch (IOException e) {

            throw new RuntimeException(e);

        } catch (InterruptedException e) {

            throw new RuntimeException(e);

        }

    }

}



[출처] https://stackoverflow.com/questions/23608005/execute-shell-commands-and-get-output-in-a-textview


하지만 위와 같은 경우 ping 명령을 실행하면 (예 : -c 3 옵션으로 3번만 시도) 진행 과정이 실시간으로 출력되지 않고 시간이 걸려 모든 결과가 출력되면 화면에 보이게 됩니다.





반응형

댓글()

안드로이드 맥어드레스 (MAC Address) 정보 가져오기

프로그래밍/Android (Java)|2020. 11. 26. 15:42
반응형

아래 코드는 onCreateView 와 동일 레벨에 작성합니다.

그리고 onCreateView 내에서 String str = getMacAddr(); 과 같이 불러오면 끝.



public static String getMacAddr() {

    try {

        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());

        for (NetworkInterface nif : all) {

            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;


            byte[] macBytes = nif.getHardwareAddress();

            if (macBytes == null) {

                return "";

            }


            StringBuilder res1 = new StringBuilder();

            for (byte b : macBytes) {

                res1.append(String.format("%02X:",b));

            }


            if (res1.length() > 0) {

                res1.deleteCharAt(res1.length() - 1);

            }

            return res1.toString();

        }

    } catch (Exception ex) {

    }

    return "02:00:00:00:00:00";

}



[출처] https://stackoverflow.com/questions/11705906/programmatically-getting-the-mac-of-an-android-device

반응형

댓글()

ViewPager2 와 Fragments 를 이용한 탭메뉴 (AndroidX)

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

[출처]  http://www.tutorialsface.com/2020/07/android-tablayout-example-using-viewpager2-and-fragments-with-latest-android-api-androidx/


In this tutorial we are going to create 3 Tabs .Every tab have its own Fragment to control over screen. Also user can swipe between 3 tabs.

we are using AndroidX support Library , ViewPager2 and 3 different fragment & 3 different xml for layouts. And TabLayout for Tabs.

Layout Demonstration :

  • Checkout the following pic which explains the complete overview of layout architecture. Basically we are using ViewPager as main layout and for individual pager views we use Fragments. The tabs are part of Action Bar.

STEP 1: CREATING PROJECT

  • Let’s start with creating new project in android studio with package name com.example.manualSliding and class name MainActivity.java and its layout name is activity_main.xml.

STEP 2: ADDING DEPENDENCIES

  • open file Gradle Scripts/build.gradle(Module: app)
  • under dependencies{ } add this:
dependencies {
   
    //this is for ViewPager
    implementation "androidx.viewpager2:viewpager2:1.0.0"
    
    //this is for TabLayout
    implementation 'com.google.android.material:material:1.2.0-alpha01'

}
  • under compileOptions{} add this:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

STEP 3: EDIT app/res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#0698bc</color>
<color name="colorPrimaryDark">#067d9b</color>
<color name="colorAccent">#FF4081</color>
<color name="frg1Color">#FEBE29</color>
<color name="frg2Color">#3395FF</color>
<color name="frg3Color">#F6437B</color>
<color name="txtBGColor">#9FA8DA</color>
<color name="white">#FFFFFF</color>
</resources>

STEP 4: EDIT app/res/values/styles.xml : we using this theme because TabLayout component works in this theme.

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

</resources>

STEP 6: CREATING LAYOUT FOR EACH FRAGMENT :

  • create new xml layout file under app/res/layout/first_frag.xml and add the below code:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/cLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/frg1Color">

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="356dp"
android:text="sample text 1"
android:textSize="25dp"
android:textStyle="bold"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • create new xml layout file under app/res/layout/second_frag.xml and add the below code:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/cLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/frg2Color">

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="356dp"
android:text="sample text 2"
android:textSize="25dp"
android:textStyle="bold"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • create new xml layout file under app/res/layout/third_frag.xml and add the below code:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/cLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/frg3Color">

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="356dp"
android:textSize="25dp"
android:textStyle="bold"
android:text="sample text 3"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

STEP 7: Create FRAGMENT CLASS for each view layout:

  • create new java class under app/java/com.example.manualSliding/FirstFragment.java
package com.example.manualsliding;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

public class FirstFragment extends Fragment {

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

TextView tv = (TextView) v.findViewById(R.id.textView1);
tv.setText(getArguments().getString("msg"));
return v;
}

public static FirstFragment newInstance(String text) {

FirstFragment f = new FirstFragment();
Bundle b = new Bundle();
b.putString("msg", text);

f.setArguments(b);

return f;
}
}
  • create new java class under app/java/com.example.manualSliding/SecondFragment.java
package com.example.manualsliding;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

public class SecondFragment extends Fragment {

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

TextView tv = (TextView) v.findViewById(R.id.textView1);
tv.setText(getArguments().getString("msg"));

return v;
}

public static SecondFragment newInstance(String text) {

SecondFragment f = new SecondFragment();
Bundle b = new Bundle();
b.putString("msg", text);

f.setArguments(b);

return f;
}
}
  • create new java class under app/java/com.example.manualSliding/ThirdFragment.java
package com.example.manualsliding;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

public class ThirdFragment extends Fragment {

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

        TextView tv = (TextView) v.findViewById(R.id.textView1);
        tv.setText(getArguments().getString("msg"));

        return v;
    }

    public static ThirdFragment newInstance(String text) {

        ThirdFragment  f = new ThirdFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}

STEP 8: app/res/layout/activity_main.xml : here we are creating TabLayout and ViewPager2.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">

<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
style="@style/Widget.MaterialComponents.TabLayout.Colored"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<androidx.viewpager2.widget.ViewPager2
android:id="@+id/mypager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

</LinearLayout>

STEP 8: app/java/com.example.manualSliding/MainActivity.java

  • Here we use FragmentStateAdapter class for creating fragment and then we will assign it into Viewpager2.
  • create Strings array of tabs titles.
    • private String[] titles = new String[]{“Tab1”, “Tab2”, “Tab3”};
  • Inflating tab layout
    • TabLayout tabLayout =( TabLayout) findViewById(R.id.tab_layout);
  • Displaying tabs
    • new TabLayoutMediator(tabLayout, viewPager,(tab, position) -> tab.setText(titles[position])).attach();
  • complete code of MainActivity.java
package com.example.manualsliding;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

public class MainActivity extends AppCompatActivity {
private static final int NUM_PAGES = 3;
//The pager widget, which handles animation and allows swiping horizontally to access previous and next wizard steps.
 public static ViewPager2 viewPager;
// The pager adapter, which provides the pages to the view pager widget.
 private FragmentStateAdapter pagerAdapter;
// Arrey of strings FOR TABS TITLES
 private String[] titles = new String[]{"Tab1", "Tab2", "Tab3"};
// tab titles
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.mypager);
pagerAdapter = new MyPagerAdapter(this);
viewPager.setAdapter(pagerAdapter);
//inflating tab layout
 TabLayout tabLayout =( TabLayout) findViewById(R.id.tab_layout);
//displaying tabs
 new TabLayoutMediator(tabLayout, viewPager,(tab, position) -> tab.setText(titles[position])).attach();
}

private class MyPagerAdapter extends FragmentStateAdapter {

public MyPagerAdapter(FragmentActivity fa) {
super(fa);
}


@Override
public Fragment createFragment(int pos) {
switch (pos) {
case 0: {
return FirstFragment.newInstance("fragment 1");
}
case 1: {

return SecondFragment.newInstance("fragment 2");
}
case 2: {
return ThirdFragment.newInstance("fragment 3");
}
default:
return FirstFragment.newInstance("fragment 1, Default");
}
}

@Override
public int getItemCount() {
return NUM_PAGES;
}
}


@Override
public void onBackPressed() {
if (viewPager.getCurrentItem() == 0) {
// If the user is currently looking at the first step, allow the system to handle the
 // Back button. This calls finish() on this activity and pops the back stack.d
 super.onBackPressed();
} else {
// Otherwise, select the previous step.
 viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
}
}

}


[출처]  http://www.tutorialsface.com/2020/07/android-tablayout-example-using-viewpager2-and-fragments-with-latest-android-api-androidx/


반응형

댓글()

쉘스크립트에서 특정시간의 전 후 시간 계산 하기

프로그래밍/BASH SHELL|2020. 11. 4. 09:30
반응형

아래는 현재 시간에서 5분전 시간을 출력합니다. now_time 변수에 특정 날짜, 시간을 넣으면 그 시간에서 부터 계산합니다.


now_time=`date +%Y-%m-d %H:%M:%S`

edit_time=`date -d "${now_time} 5 minute ago"`


echo $edit_time


[ 결과 ]


# echo $edit_time

Wed 04 Nov 2020 09:22:19 AM KST  // 5분 전 시간


# date

Wed 04 Nov 2020 09:27:22 AM KST  // 현재 시간



분 외에 시간이나 초, 날짜 등 전후의 시간계산을 원하시는 분은 아래 링크를 참조하여 진행하시면 됩니다.

정리가 잘 되어 있습니다.


https://soft.plusblog.co.kr/97


반응형

댓글()

c언어 문자열 포함 여부 확인

프로그래밍/C, C++|2020. 10. 22. 08:47
반응형

아래는 문자열에 특정 문자가 포함되었는지를 확인하는 소스 입니다.

 

# vi a.cc

 

#include <stdio.h>
#include <string.h>


int main() {


        if (strstr("abc", "a") != NULL) {    // abc 라는 문자열에 a 가 포함되었는지 확인
           printf("포함");
        } else {
           printf("미포함");
        }


        return 0;
}

 

# gcc a.cc -o a

 

# ./a

포함

 

 

반응형

댓글()

c언어 특정 문자로 문자열 자르고 출력하기

프로그래밍/C, C++|2020. 10. 21. 15:46
반응형

# vi test.cc

char partN[] = "C,D"

char* p = strtok(partN, ",");  // partN 내용을 콤마 기준으로 나눕니다.

while (p != NULL) {

    printf("%s\n", p);  // 콤마 기준으로 나눈것을 하나씩 출력합니다.

    p = strtok(NULL, ",");

}

 

# gcc test.cc -o test

 

# ./test

abc/qwe/ccd

 

 

[출처] https://stackoverflow.com/questions/15472299/split-string-into-tokens-and-save-them-in-an-array

반응형

댓글()

c언어 문자열에서 공백 또는 특정 문자 제거

프로그래밍/C, C++|2020. 9. 21. 09:43
반응형

char msg[100];

char msgN[100];
 
sprintf(msg, "This is text.");
 
int i = 0, c = 0; // 쌍따옴표 제거
for(; i < strlen(msg); i++)
{
    //if (isalnum(msg[i]))  // msg 문자(a-z, A-Z, 0-9)를 제외한 모든것 제거하고 싶은 경우 사용
    if (msg[i] != '\"')             // msg 에서 쌍따옴표 제외하는것이 목적일 경우
    {
        msgN[c] = msg[i];
        c++;
    }
}
msgN[c] = '\0';
 

 

msg 에 있던 This is text. 가

msgN 에서는 변경된 조건으로 저장되어 집니다.

 

 

반응형

댓글()

c언어 변수를 이용해 시스템 명령어 사용

프로그래밍/C, C++|2020. 9. 21. 09:04
반응형

char cmd[100];

sprintf(cmd, "ls /home/%s", username);

system(cmd);

 

* 설명

값이 들어 있는 username 을 가져와서 명령을 수행하기위해 만들어 놓은 변수 cmd 에 넣고

system() 함수를 이용해 실행한다.

 

반응형

댓글()