본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-29안드로이드 스튜디오(메뉴, 브로드캐스트 와 서비스이용 예제)

반응형

메뉴 구성을 위한 함수

onCreateOpionsMenu(Menu menu) {

MenuItem item1 = menu.add (0 , 0 , 0 , "슬라이드쇼" )

MenuItem item2 = menu.add (0 , 1 , 0 , "앨범에 추가" )

}

아이템 선택했을떄 실행역역

위코드는 아이템을 선택하였을때 그 아이템의 인덱스로 구별하여 어떤버튼인지에 따라서 작업을 해줄수 있다 

 

 

이렇게 코드로 메뉴를 구성할 수도 있고 xml파일을 이용하여 메뉴를 구성할 수도 있다.

다음은 코드로 보자 

메인으로 들어가기전에 xml을 먼저 만들어 주자 

xml 생성

xml 작성 부분 

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

<!-- xml로 메뉴 만들어주기 -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"

 #   xmlns:app="http://schemas.android.com/apk/res-auto">  #
    
    <item
        android:id="@+id/menu1"
        android:icon="@drawable/ic_menu_1"
        android:title="선택" />
    <item
        android:id="@+id/menu2"
        android:icon="@drawable/ic_menu_2"
        android:title="레이아웃" />

    <item
        android:id="@+id/menu3"
        android:title="sub Menu">
        <menu>
            <item
                android:id="@+id/sub1"
                android:title="sub 1" />
            <item
                android:id="@+id/sub2"
                android:title="sub 2" />
        </menu>

    </item>
    <!--서치뷰 만들어주었다 -->
    <item
        android:id="@+id/menu_mainsearcch"
        android:icon="@android:drawable/ic_menu_search"
        android:title="search"
        app:showAsAction="always"
        app:actionViewClass="androidx.appcompat.widget.SearchView"/> <!--책과 다른부분이 이부분이다.-->

</menu>

xml작성시 중요한부분은  # xmlns:app="http://schemas.android.com/apk/res-auto">  # 이부분이다 

처음 생성하면 저부분이 빠져 있으므로 다른 xml에서 복사해서 붙여 넣어주면 이상없이 작동한다 

 

메인 

public class MainActivity extends AppCompatActivity {
    SearchView searchView;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.imageView);
        //이미지뷰를 넣어서 컨택스트메뉴에 사용하겠다
        registerForContextMenu(imageView);
    }

   /* @Override //자바코드로 할수 있는 간단한 방법의 메뉴 만들기
    public boolean onCreateOptionsMenu(Menu menu) {
        //1. 메뉴만드는 메소드
       MenuItem item1 = menu.add(0,0,0,"선택");
       MenuItem item2 = menu.add(0,1,0,"레이아웃");

       return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //2. 메뉴 선택하는 메소드
        //여기서 인텐트사용하여 다른 액티비티로 이동도 가능하다
        //3. res에 메뉴xml 만들어주었음
        if (item.getItemId() == 0){
            Toast.makeText(getApplicationContext(),"선택메뉴를 선택하였스비ㅏㄷ." , Toast.LENGTH_LONG).show();
        }else if (item.getItemId() == 1) {
            Toast.makeText(getApplicationContext(), "레이아웃메뉴를 선택하였스비ㅏㄷ.", Toast.LENGTH_LONG).show();
        }
        return super.onOptionsItemSelected(item);
    }*/

    @Override // 1-1 xml메뉴를 인플레이터 해서 사용할수 있도록 해줌
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_main, menu);

        //아이콘 나오게 하는 하나의 방법이니까 기억해놔
        //아이콘을 보여주기위하여 사용한 코드  getDeclaredMethod 빨간불 들어오면 alt +O 눌러서
        //이렇게 트라이 캐치문 나오면 사용해준다
        try {
            Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible",boolean.class);
            method.setAccessible(true);
            method.invoke(menu,true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //서치뷰 메뉴 만들기
        MenuItem menuItem = menu.findItem(R.id.menu_mainsearcch);
        searchView = (SearchView)menuItem.getActionView();
        searchView.setQueryHint("검색어를 입력하세요");
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override //단어 다쓰면 전달하는 메소드
            public boolean onQueryTextSubmit(String query) {
                searchView.setQuery("",false); // 글 사용후 글 지우겠다
                searchView.setIconified(true); // 아이콘은 그대로 나오게 하겠다
                Toast.makeText(getApplicationContext(),query,Toast.LENGTH_LONG).show();
                return false;
            }

            @Override//한단어 쓸때마다 전달함
            public boolean onQueryTextChange(String newText) {
                Toast.makeText(getApplicationContext(),newText,Toast.LENGTH_LONG).show();
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    @Override //컨택스트메뉴
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0,0,0,"안드로이드프로그래밍");
        menu.add(0,1,0,"자바프로그래밍");
        menu.add(0,2,0,"아옳이!!! ");
    }

    @Override //아이템에따라 실행
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId() ){
            case 0:
                Toast.makeText(getApplicationContext(),"안드로이드프록래밍을 선택하였습니다.",Toast.LENGTH_LONG).show();
                break;
            case 1:
                Toast.makeText(getApplicationContext(),"자바프로그래밍 선택하였습니다.",Toast.LENGTH_LONG).show();
                break;
            case 2:
                Toast.makeText(getApplicationContext(),"아옳이!!! 선택하였습니다.",Toast.LENGTH_LONG).show();
                break;

        }

        return super.onContextItemSelected(item);
    }
}

 

 

여러가지의 기능들중 한 기능이라 이해를 해놓고 나중에 사용할때 책이랑 코드랑 같이 보면 될거 같다 .~ 

 

오늘수업은 여기까지 ~ 


브로드캐스트와 서비스를 사용하여 데이터 전달하기 

이런식으로 내가 글을 입력을하고 보내기 버튼을 누르면 해당 글자는 서비스로 이동을 하여 서비스에서 다시 브로드캐스트 수신자를 통해 원래 있던 액티비티의 텍스트뷰에 출력을 해줄것이다. 

메인액티비티

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;

    MyReceiver receiver;

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

        editText = findViewById(R.id.edt);
        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String input = editText.getText().toString();
                Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
                serviceIntent.putExtra("data", input);

                startService(serviceIntent);// 서비스로 보내주면서 서비스 시작
            }
        });

        receiver = new MyReceiver(); // 리시버 만듬

        IntentFilter filter = new IntentFilter(); // 필터만들고 액션 추가
        filter.addAction("com.cyberkyj.broadcast.show"); // 액션 추가 (매니패스트에 추가도 가능) +/*
        registerReceiver(receiver, filter); //

    }

    class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String data = intent.getStringExtra("data");
                if (data != null) {
                    textView.setText("받은 결과 : " + data);
                }
            }
        }
    }
   @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

서비스액티비티

public class MyService extends Service {
    public MyService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (intent != null) {
            String data = intent.getStringExtra("data");
            if (data != null) {
                Intent activityIntent = new Intent();
                activityIntent.setAction("com.cyberkyj.broadcast.show");
                activityIntent.putExtra("data", data);

                sendBroadcast(activityIntent);
            }
        }


        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

ㅋ티비티 코드를 잘보면 처음에 에디트텍스트에서 문자받아 서비스로 넘겨주고 서비스에서는 받은 데이터를 리시버가 받을수 있게 넘겨 주고있다. 

그리고 중요한 부분은 메인에 리시버를 이너클래스로 만들어 접근이 편리하도록 만들어 주었다 ~ 

 

오늘도 고생했쑝~!!! 

반응형