728x90
반응형

플로팅 액션 버튼은 머터리얼 디자인 중 하나로, 화면 위에 위치가 고정된 버튼입니다.

 

스크롤 바를 내리든, 다른 일을 하든 설정된 위치에 고정되어있습니다. (해당 xml화면 안에서만)

 

 

 

 

머터리얼 디자인 사용 설정하기

Gradle Scripts -> build.gradle (Module: app) -> dependencides 안에 아래 코드를 입력합니다.

implementation 'com.google.android.material:material:1.1.0-beta01'

 

 

 

코드를 입력했다면, Sync Now를 눌러줍니다.

 

 

 

 

 

 

 

 

 

플로팅 버튼.xml

처음 xml을 만들었을때, 레이아웃을 androidx.coo 어쩌구로 설정해줍니다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:background="@color/White">

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

	//구현하고 싶은 화면은 이곳에 작성하시면 됩니다.


</LinearLayout>

//플로팅 버튼
<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/fab_btn"
    android:layout_gravity="end|bottom"
    android:layout_margin="16dp"
    app:fabSize="normal"
    app:elevation="6dp"
    app:backgroundTint="@color/Yellow"
    android:src="@drawable/ic_add_black_24dp"></com.google.android.material.floatingactionbutton.FloatingActionButton>


</androidx.coordinatorlayout.widget.CoordinatorLayout>

androidx.coordinatorlayout.widget.CoordinatorLayout 밑에 리니어 레이아웃을 하나 만들어서 그 안에 화면을 꾸미면 편합니다.

 

플로팅 버튼 선언은 coordinatorlayout 바로 아래에 들어가도록 하면 됩니다.

 

 

 

플로팅 버튼.class

public class Together_Customlist extends AppCompatActivity {

    FloatingActionButton fab;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.together_recycler);
        
        fab = (FloatingActionButton)findViewById(R.id.fab_btn);

      
        //플로팅 버튼
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(getApplicationContext(), make_group.class); //그룹 만들기 화면으로 연결
                startActivity(intent); //액티비티 열기
            }
        });

    }
}

플로팅 버튼을 누르면 새로운 액티비티가 열리도록 하였다.

728x90
반응형
728x90
반응형

작업할 클래스.java

public class make_group extends AppCompatActivity {

    Button add;
    CalendarView calendarView;


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

        add = (Button)findViewById(R.id.addGroup_btn);
        calendarView = (CalendarView)findViewById(R.id.calendarView);//캘린더뷰


        
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
	        //현재의 날짜와 시간을 가지고 있는 캘린더 객체 생성
                Calendar calendar = Calendar.getInstance();

                //캘린더뷰에서 날짜값 읽어오기
                Date date = new Date(calendarView.getDate());

                //캘린더 객체에 캘린더뷰 값을 넣음
                calendar.setTime(date);

                //캘린더뷰 값을 넣은 캘린더 객체의 날짜값을 문자열로 변환!
                // ex)2021-03-14
                String caldate = Integer.toString(calendar.get(Calendar.YEAR))+ "-" + Integer.toString(calendar.get(Calendar.MONTH)) + "-" +Integer.toString(calendar.get(Calendar.DATE));
                
            }
        });
    }
  
}

저는 버튼을 누르면 문자열에 캘린더뷰 날짜가 저장되도록 만들었습니다.

 

저는 사실 파이어베이스에 저장하도록 만들었었는데, 여러분도 그런식으로 활용하거나 텍스트뷰에 넣는 등 원하는대로 사용하시면 좋을것같습니다.

728x90
반응형
728x90
반응형

1. 참조하는 위치가 더이상 분열되지 않고 끝자리라면

 

username까지 참조해서 "러아니푸"값 하나만을 직접 받아오기

 

 

구동시킬 자바.class

databaseReference.child("User").child(uid).child("username").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        String value = dataSnapshot.getValue(String.class);
                        uname= value;

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        //Log.e("MainActivity", String.valueOf(databaseError.toException())); // 에러문 출력
                    }
                });

 

 

 

 

 

 

 

 

2. 참조되는 부분 아래로 값이 여러개 있는 경우

 

Together_group_list 아래의 그룹명인 한울을 참조하고있고, 한울 속에있는 속성 여러개를 받아오고 싶을때

 

구동시킬 자바.class

databaseReference.child("Together_group_list").child(Gname).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Together_group_list group = dataSnapshot.getValue(Together_group_list.class);
                
                //각각의 값 받아오기 get어쩌구 함수들은 Together_group_list.class에서 지정한것
                gintro = group.getGintro();
                goaltime = group.getGoaltime();
                gdate = group.getGoalday();
                
                //텍스트뷰에 받아온 문자열 대입하기
                goaltime_tv.setText(goaltime);
                gintro_tv.setText(gintro);
                gdate_tv.setText(gdate);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                //Log.e("MainActivity", String.valueOf(databaseError.toException())); // 에러문 출력
            }
        });

 

Together_group_list.class

package com.example.together.Group;

public class Together_group_list {

    
    //변수 선언
    private String Gname; 
    private String Gintro; 
    private String Goaltime; 
    private String Goalday; 
    private String master;


    
    public Together_group_list(){}
   
   
   
   //여기서부터 get,set 함수를 사용하는데 이부분을 통해 값을 가져옴
    public String getGname() {
        return Gname;
    }

    public void setGname(String Gname) {
        this.Gname = Gname;
    }

    public String getGintro() {
        return Gintro;
    }

    public void setGintro(String Gintro) {
        this.Gintro = Gintro;
    }

    public String getGoaltime() {
        return Goaltime;
    }

    public void setGoaltime(String Goaltime) {
    	this.Goaltime = Goaltime;
    }

    public String getGoalday() {
        return Goalday;
    }

    public void setGoalday(String Goalday) {
        this.Goalday = Goalday;
    }

    public String getmaster() {
        return master;
    }

    public void setmaster(String userId) {
        this.master = master;
    }




    //이거는 그룹을 생성할때 사용하는 부분
    public Together_group_list(String Gname, String Gintro, int GCP, int GAP, String Goaltime, String Goalday, String master) {
        this.Gname = Gname;
        this.Gintro = Gintro;
        this.GCP = GCP;
        this.GAP = GAP;
        this.Goaltime = Goaltime;
        this.Goalday = Goalday;
        this.master = master;

    }



}

 

 

 

 

 

 

3. 정수형을 받아오고 싶은 경우

 

구동시킬 자바.class

databaseReference.child("Together_group_list").child(Gname).child("gap").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            int value = (int)snapshot.getValue(Integer.class);//저장된 값을 숫자로 받아오고
                            value +=1;//숫자를 1 증가시켜서
                            databaseReference.child("Together_group_list").child(Gname).child("gap").setValue(value);//저장
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            //Log.e("MainActivity", String.valueOf(databaseError.toException()));
                        }



                    });

 

저장된 값을 받아와서 1증가시키는 코드입니다.

 

파이어베이스는 json형태로 저장되기 때문에 int로 값을 저장했어도 받아올때는 int로 형변환을 해줘야합니다.

 

728x90
반응형
728x90
반응형

 

Glook_Adapter.java

package com.example.together.Group;

//import 부분은 지저분해서 지웠습니다.
//import android.widget.PopupMenu; 등 몇가지를 추가했던것 같은데..
//빨간줄 생기면 alt+enter로 추가하세요!


public class Glook_Adapter extends RecyclerView.Adapter<Glook_Adapter.CustomViewHoler> {


    private ArrayList<User_group> arrayList;
    private Context context;

    public Glook_Adapter(ArrayList<User_group> arrayList, Context context) {
        this.arrayList = arrayList;
        this.context = context;


    }

    @NonNull
    @Override
    public CustomViewHoler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.glook_list, parent, false);
        CustomViewHoler holer = new CustomViewHoler(view);
        return holer;

    }

    @Override
    public void onBindViewHolder(@NonNull final CustomViewHoler holder, int position) {
        Glide.with(holder.itemView)
                .load(arrayList.get(position).getiv_people())
                .into(holder.iv_people); */
        holder.uname.setText(arrayList.get(position).getuname());

	//커스텀 리스트뷰의 리스트 자체를 가져옴.
        holder.itemView.setTag(position);
        //롱클릭 시
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
            	
                //여기서부터 팝업메뉴!
                PopupMenu popup= new PopupMenu(context.getApplicationContext(), view);//v는 클릭된 뷰를 의미

                popup.getMenuInflater().inflate(R.menu.user_menu, popup.getMenu());
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()){
                            case R.id.m1:
                                Toast.makeText(view.getContext(), "그룹장위임",Toast.LENGTH_SHORT).show(); //토스트로 실험
                                break;
                            case R.id.m2:
                                Toast.makeText(view.getContext(), "추방",Toast.LENGTH_SHORT).show(); //토스트로 실험
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popup.show();
                //여기까지 팝업메뉴!

                return true;
            }
        });



    }


    @Override
    public int getItemCount() {
        return (arrayList != null ? arrayList.size() : 0);
    }


    public class CustomViewHoler extends RecyclerView.ViewHolder {
        TextView uname;


        public CustomViewHoler(@NonNull View itemView) {
            super(itemView);
            this.uname = itemView.findViewById(R.id.username);

        }
    }

}

public void onBindViewHolder 안에서 CustomViewHoler에서 선언한 itemView를 롱 클릭했을때, 팝업 메뉴가 나오도록 한다.

728x90
반응형
728x90
반응형

번들을 사용하여 프래그먼트 간 데이터를 전달하는 간단한 예제입니다.

 

 

 

 

 

 


activity.xml

<?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"
    tools:context=".MainActivity">

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

    </FrameLayout>
</LinearLayout>

 

 

fragment_1.xml

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

    <EditText
        android:id="@+id/edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:hint="이름을 쓰세요"
        android:textSize="30sp"/>

    <Button
        android:id="@+id/btn"
        android:layout_width="100dp"
        android:layout_marginLeft="10dp"
        android:layout_height="wrap_content"
        android:text="확인" />
</LinearLayout>

 

 

fragment_2.xml

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

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="이름"
        android:textSize="30sp"/>

</LinearLayout>

 

 

 

 

 

 

 


 

MainActivity.java

public class MainActivity extends AppCompatActivity {

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


        //프래그먼트1 연결
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        Fragment1 fragment1 = new Fragment1();
        transaction.replace(R.id.frame, fragment1);
        transaction.commit();


    }
}

 

 

Fragment1.java

public class Fragment1 extends Fragment {

    private View view;
    private Button btn;
    EditText edit;

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

        edit = view.findViewById(R.id.edit);
        btn = view.findViewById(R.id.btn);


        btn.setOnClickListener(new View.OnClickListener() { // 프래그먼트2로 이동
            @Override
            public void onClick(View view) {
                Bundle bundle = new Bundle(); // 번들을 통해 값 전달
                bundle.putString("name",edit.getText().toString());//번들에 넘길 값 저장
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                Fragment2 fragment2 = new Fragment2();//프래그먼트2 선언
                fragment2.setArguments(bundle);//번들을 프래그먼트2로 보낼 준비
                transaction.replace(R.id.frame, fragment2);
                transaction.commit();
            }
        });


        return view;
    }


}

 

 

Fragment2.java

public class Fragment2 extends Fragment {

    private View view;
    private TextView tv_name;
    private String name;

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

        tv_name = view.findViewById(R.id.tv_name);

        if (getArguments() != null)
        {
            name = getArguments().getString("name"); // 프래그먼트1에서 받아온 값 넣기
            tv_name.setText(name);
        }


        return view;
    }


}

 

 

728x90
반응형
728x90
반응형

인텐트로 값을 받을때 코드 위치가 이상한 경우

 

오류: java.lang.NullPointerExceptoin

public class look_memo extends AppCompatActivity {

    private Intent intent;

    TextView mname,mcontent;
    String mname1,mcontent1;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.look_memo);
		
        //인텐트 연결은 onCreate 안에서 해야합니다.
        intent = getIntent();
        mname1 = intent.getStringExtra("mname");
        

    }
}

 

 

 

 

매니페스트에 자바파일 설정을 안한 경우

 

오류: android.content.ActivityNotFoundException: Unable to find explicit activity class

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xxx">


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="xxx"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".make_memo"></activity> //새로 만든 화면은 이렇게 작성
        <activity android:name=".look_memo"></activity>
    </application>

</manifest>

 

 

 

연결을 했는데 값이 넘어가지 않는 경우

 

값을 넘기는 부분에서 값을 지정하는 이름이 다르다면 같게 만들어준다.

 

intent.putExtra("mname", mname); //값을 넘기는 부분
mname1 = intent.getStringExtra("mname");// 값을 받는 부분

 

728x90
반응형

+ Recent posts