FloatingActionButton 끌어오고 id 지정해준다.

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                activityResultLauncher.launch(intent);
            }
        });

fab으로 변수만들고 객체 대입해준다음 리스너 만든다

res -> new -> Android Resource 눌르고

fil name 적고 Resource type을 Menu로 고르고 ok 한다.

원하는 ui배치하고 id와 title을 정해준다.icon과 showAsAction도 정해준다.

// xml로 만든 메뉴를, 액티비티의 화면에 나타나게 해주는 함수!
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();

        if (itemId == R.id.menuAdd) {
            Intent intent = new Intent(MainActivity.this, AddActivity.class);
            activityResultLauncher.launch(intent);
        } else if (itemId == R.id.menuAbout) {
            // todo : About 클릭했을때 하고 싶은 일 코드 작성.
        }

        return super.onOptionsItemSelected(item);
    }

메뉴를 나타나게 해주고 아이템 선택되었을 때 코드를 작성해 준다.

MainActivity.java 파일에

// 내가 실행한 액티비티로부터 데이터를 다시 받아올때 작성하는 코드
    public ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == RESULT_OK) {
                int index = result.getData().getIntExtra("index", 0);
                Employee employee = (Employee) result.getData().getSerializableExtra("employee");
                employeeList.set(index, employee);
                adapter.notifyDataSetChanged();
            }
        }
    });

ActivityResultLauncher를 만들고 onActivityResult안에 원하는 코드를 작성한다.

 

EmployeeAdapter.java 파일에

cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int index = getAdapterPosition();

                    Employee employee = employeeList.get(index);

                    Intent intent = new Intent(context, EditActivity.class);

                    intent.putExtra("employee", employee);
                    intent.putExtra("index", index);
                    //context.startActivity(intent);
                    ((MainActivity) context).activityResultLauncher.launch(intent);
                }
            });

카드뷰 클릭할 때 activityResultLancher를 통해서 실행시킨다.

EditActivity가 데이터를 받고 finish하면 MainActivity가 데이터를 받는다.

editSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                // 키워드 검색 에디트텍스트에 글자를 쓸때마다,
                // 자동으로 해당 검색어를 가져와서, 디비에서 쿼리해서
                // 검색 결과를 화면에 표시해 주는 기능 개발
                String keyword = editSearch.getText().toString().trim();
                Log.i("MyMemoApp", keyword);

                if (keyword.length() < 2) {
                    return;
                }

                DatabaseHandler db = new DatabaseHandler(MainActivity.this);
                memoList = db.searchMemo(keyword);
                adapter = new MemoAdapter(MainActivity.this,memoList);
                recyclerView.setAdapter(adapter);
            }
        });

텍스트의 addTexChagedListener 함수에다 TextWatcher 객체를 넣는다.

글자가 바뀌기전 바꼈을 때 바뀐 후 각각 함수에다가 원하는 코드를 넣는다. 

먼저 클래스에 implements Serializable을 붙여준다.

Intent intent = new Intent(context, EditActivity.class);
intent.putExtra("contact", contact);
context.startActivity(intent);

contact클래스를 보낸다.

contact = (Contact) getIntent().getSerializableExtra("contact");

contact클래스를 getSerializableExtrat로 받고 형변환을 해준다.

package com.minui.contactmanager.adapter;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.minui.contactmanager.EditActivity;
import com.minui.contactmanager.R;
import com.minui.contactmanager.model.Contact;

import java.util.List;

// row 화면에 맵핑할 어댑터 클래스 만드는 순서

// 1. RycyclerView.Adapter 를 상속받는다.
//   unimplemented method 모두 선택해서 넣는다.


// 5. RecyclerView.Adapter 의 데이터타입을 알려줘야 한다ㅏ.
// 우리가 만든 ViewHolder 의 타입으로 설정 => 그러면 빨간색 뜬다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {

    // 4. 어댑터 클래스의 멤버변수와 생성자를 만들어 준다.
    Context context;
    List<Contact> contactList;

    public ContactAdapter(Context context, List<Contact> contactList) {
        this.context = context;
        this.contactList = contactList;
    }

    // 6. 아래 함수들 구현. 연결 정보
    @NonNull
    @Override
    public ContactAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_row, parent, false);
        return new ContactAdapter.ViewHolder(view);
    }

    // 7. 메모리에 있는 데이터(리스트) 를 화면에 표시하는 함수.
    @Override
    public void onBindViewHolder(@NonNull ContactAdapter.ViewHolder holder, int position) {
        Contact contact = contactList.get(position);

        holder.txtName.setText(contact.name);
        holder.txtPhone.setText(contact.phone);
    }

    @Override
    public int getItemCount() {
        return contactList.size();
    }

    // 2. ViewHolder 클래스를 만든다.
    // 이 클래스는 row.xml 화면에 있는 뷰를 연결 시키는 클래스
    // 빨간색 눌러서 생성자 만든다.
    // 화면과 연결할 자바 변수를 만든다.
    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView txtName;
        TextView txtPhone;
        ImageView imgDelete;
        CardView cardView;

        // 3. 생성자 안에다가, 연결시키는 코드를 작성한다.
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            txtName = itemView.findViewById(R.id.txtName);
            txtPhone = itemView.findViewById(R.id.txtPhone);
            imgDelete = itemView.findViewById(R.id.imgDelete);
            cardView = itemView.findViewById(R.id.cardView);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //카드뷰를 클릭하면 처리할 코드 작성.

                    // 1. 유저가 몇번째 행을 클릭했는지, 인덱스로 알려준다.
                    int index = getAdapterPosition();

                    // 2. 이 인덱스에 저장되어 있는 데이터를 가져온다.
                    Contact contact = contactList.get(index);

                    // 3. todo: 아이디, 이름, 전화번호를, 수정하는 화면으로 데이터를 넘겨준다.
                    Intent intent = new Intent(context, EditActivity.class);
                    intent.putExtra("id", index);
                    intent.putExtra("name", txtName.getText().toString());
                    intent.putExtra("phone", txtPhone.getText().toString());
                    context.startActivity(intent);
                }
            });

            imgDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // TODO: 엑스이미지 누르면, 해당 주소로 삭제하도록 개발!
                }
            });
        }
    }
}

순서와 설명은 주석참고

for(Contact data : contactList) {
     Log.i("MyContact", "id : " + data.id + " , name : "+data.name + " , phone : " + data.phone);
}

오른쪽에있는 것을 하나씩 꺼내서 왼쪽에 대입한다.

package com.minui.contactmanager.data;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import androidx.annotation.Nullable;

import com.minui.contactmanager.model.Contact;
import com.minui.contactmanager.util.Util;

import java.util.ArrayList;

public class DatabaseHandler extends SQLiteOpenHelper {
    public DatabaseHandler(@Nullable Context context) {
        super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 테이블 생성
        String CREATE_CONTACT_TABLE = "create table " + Util.TABLE_NAME + "(" +
                Util.KEY_ID + " integer primary key, " +
                Util.KEY_NAME + " text, " +
                Util.KEY_PHONE + " text )";

        Log.i("MyContact", "테이블 생성문 : " + CREATE_CONTACT_TABLE);

        sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        // 기존의 contact 테이블을 삭제하고,
        String DROP_TABLE = "drop table " + Util.TABLE_NAME;
        sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DATABASE_NAME});

        // 새롭게 테이블을 다시 만든다.
        onCreate(sqLiteDatabase);
    }

    // 우리가 앱 동작시키는데 필요한 SQL 문이 적용된 함수들을 만든다.

    public void addContact(Contact contact) {
        // 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getWritableDatabase();

        // 테이블의 컬럼이름과 해당 데이터를 매칭해서 넣어준다.
        ContentValues values = new ContentValues();
        values.put(Util.KEY_NAME, contact.name);
        values.put(Util.KEY_PHONE, contact.phone);
        // 데이터베이스에, 위의 데이터를 insert
        db.insert(Util.TABLE_NAME, null, values);
        // db를 닫아줘야 한다.
        db.close();
    }

    // 주소록 데이터 가져오기
    // 1개의 주소록 데이터만 가져오기 : id로 가져오기
    // select * from contact where id = 3;
    public Contact getContact(int id) {
        // 1. 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. 쿼리문 만든다.
        Cursor cursor = db.rawQuery("select * from contact where id = " + id, null);
        // Cursor cursor2 = db.rawQuery("select * from contact where id = ?", new String[]{"" + id});

        if(cursor != null) {
            cursor.moveToFirst();
        }

        // 데이터를 가져오려면, 컬럼의 인덱스를 넣어주면 된다.
        // id를 가져오는 방법
        // cursor.getInt(0);
        // name을 가져오는 방법
        // cursor.getString(1);
        // phone 을 가져오는 방법
        // cursor.getString(2);

        // DB에 저장된 데이터를 메모리에다 만들어줘야, cpu가 처리할 수 있다.
        Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));

        return contact;
    }

    // 주소록 데이터 전체 가져오기
    // select * from contact;

    public ArrayList<Contact> getAllContacts() {
        // 1. 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. 쿼리문 만든다.
        Cursor cursor = db.rawQuery("select * from contact", null);

        ArrayList<Contact> contactList = new ArrayList<Contact>();

        cursor.moveToFirst();

//        for(int i = 0; i < cursor.getCount(); i++) {
//            Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
//            contactList.add(contact);
//            cursor.moveToNext();
//        }

        if(cursor.moveToFirst()) {
            do {
                Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
                contactList.add(contact);
            } while(cursor.moveToNext());
        }

        return contactList;
    }

    // 데이터 수정하는 함수
    public void updateContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

//        ContentValues values = new ContentValues();
//        values.put(Util.KEY_NAME, contact.name);
//        values.put(Util.KEY_PHONE, contact.phone);
//        db.update(Util.TABLE_NAME, values, Util.KEY_ID + "=?", new String[]{contact.id + ""});

        db.execSQL("update contact set name = ? , phone = ? where id = ?", new String[]{contact.name, contact.phone, contact.id + ""});
        db.close();
    }

    public void deleteContact(Contact contact) {
        // delete from contact where id = 1;
        SQLiteDatabase db = this.getWritableDatabase();

        db.execSQL("delete from contact where id = ?", new String[]{contact.id + ""});

        db.close();
    }
}

SQLiteOpenHelper 클래스를 상속받아 onCreate onUpgrade를 작성해준다.

데이터 저장

SharedPreferences sp = getSharedPreferences("Alarm", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt("millisInFuture", millisInFuture);
editor.apply();

객체 만들고 에디터 만든 뒤 키와 벨류를 넣고 어플라이한다.

 

데이터 불러오기

SharedPreferences sp = getSharedPreferences("Alarm", MODE_PRIVATE)
int savedTime = sp.getInt("millisInFuture", 0);
editTime.setText("" + savedTime);

객체 만들고 키와 디폴트 값으로 불러온다.

package com.minui.data;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editName;
    EditText editAge;
    Button button;

    // 내가 실행한 액티비티로 부터, 데이터를 가져와서 처리하는 코드

    ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            // result 에는 resultCode가 있다.
            // resultCode의 값으로, 여러가지 구성해서 사용이 가능하다
            if (result.getResultCode() == 0) {
                int age = result.getData().getIntExtra("age", 0);
                editAge.setText("" + age);
            }
        }
    });

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

        editEmail = findViewById(R.id.editEmail);
        editName = findViewById(R.id.editAge);
        editAge = findViewById(R.id.editAge);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String email = editEmail.getText().toString().trim();
                String name = editName.getText().toString().trim();
                String ageStr = editAge.getText().toString().trim();

                int age = Integer.valueOf(ageStr).intValue();

                double hiddenData = 3.1414;

                // 새로운 액티비티를 띄우고,
                // 데이터를 전달한다.
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("email",email);
                intent.putExtra("name", name);
                intent.putExtra("age", age);
                intent.putExtra("hidden", hiddenData);

                // 데이터만 전달하는 경우
                // startActivity(intent);

                // 실행한 액티비티로부터 데이터를 받아오는 것이 있는 경우
                startActivityResult.launch(intent);
            }
        });
    }
}
package com.minui.data;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    TextView txtEmail;
    TextView txtName;
    EditText editAge;
    Button button;

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

        // 넘어오는 데이터가 있으면 처리해 준다.
        String email = getIntent().getStringExtra("email");
        String name = getIntent().getStringExtra("name");
        int age = getIntent().getIntExtra("age", 0);
        double hiddenData = getIntent().getDoubleExtra("hidden", 0);

        // 화면과 연결
        txtEmail = findViewById(R.id.txtEmail);
        txtName = findViewById(R.id.txtName);
        editAge = findViewById(R.id.editAge);
        button = findViewById(R.id.button);

        // 데이터를 화면에 셋팅!!!!
        txtEmail.setText(email);
        txtName.setText(name);
        editAge.setText(age + "");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 1. 수정한 나이 데이터를 가져온다.
                String ageStr = editAge.getText().toString().trim();
                int age = Integer.valueOf(ageStr).intValue();

                // 2. 이 나이 데이터를 MainActivity에 전달한다.
                Intent intent = new Intent();
                intent.putExtra("age", age);
                setResult(0, intent);

                // 3. 이 액티비티는 종료한다.
                finish();
            }
        });

    }
}

ActivityResultLauncher를 설정해주고 코드와 데이터를 받는다.

데이터를 전해줄 쪽에서는 인텐트 객체에 putExtra를 넣고 setResult한다음 종료한다.

+ Recent posts