«   2024/12   »
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
Archives
Today
Total
관리 메뉴

[위미르 개발팀] Android, iOS , Web 제작

[안드로이드 컴포넌트]액티비티와 프래그먼트간의 소통 본문

개발자료/Android

[안드로이드 컴포넌트]액티비티와 프래그먼트간의 소통

위미르개발팀 2017. 9. 23. 11:30

안드로이드는 레이아웃을 액티비티와 프래그먼트를 이용해서 구성합니다.


하지만 프래그먼트의 베이스는 액티비티이고 액티비티 하나는 여러 프래그먼트와 관계를 가지고 있기때문에


여기에 공통된 기능을 집어넣고 프래그먼트에서 사용하면 각 프래그먼트마다 정의해놓고 사용할 필요가 없이 코드가 간결해지고 효율적입니다.


예를들어서 SQLite를 사용하는데, 이를 사용하는 프래그먼트가 많이 있습니다.


이럴때 프래그먼트마다 db에 접근하는 객체를 만들어서 사용하려면 귀찮으니 액티비티에 하나만 만들어두고 프래그먼트에서 이를 사용하면 됩니다.


하지만, 문제가 되는점은 액티비티의것을 프래그먼트에서 사용하려고 할때 입니다.


예를들어서 db객체의 이름은 db이고  MainActivity에서 사용되는 프래그먼트들이 

MainActivity main = new MainActivity(); 

main.db

이런식으로 사용하는건 그냥봐도 안될것같습니다.


db객체를 static으로 만들어서 사용하면 MainActivity.db 라고 사용할수는 있겠지만 이는 계속 메모리에 남아있고 다른클래스에서 직접적으로 접근하는방법은 좋지못하다고 자바를 공부할때 배웠을것입니다.


이때 사용가능한것이 Interface입니다.


인터페이스를 활용하면 private로 선언된 클래스의 필드들을 가져올수 있게 해주는 접근자 메소드와 비슷한 효과를 낼수 있습니다.


예제를 보여드리겠습니다.



InsertDB.java

1
2
3
4
public interface InsertDB {
    public void insert(String arg0,String arg1,String arg2,String table);
}
 
cs




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
public class MainActivity extends AppCompatActivity implements InsertDB{
 
    private SQLiteDatabase db;
    private MySQLiteOpenHelper helper;
    private Frag1 frag;
    private FragmentManager fm;
    private FragmentTransaction tran;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        helper=new MySQLiteOpenHelper(this);
        db=helper.getReadableDatabase();
        frag = new Frag1();
        fm = getFragmentManager();
        tran = fm.beginTransaction();
        tran.replace(R.id.main_frame, frag1);              
        tran.commit();    
    }
 
    @Override
    public void insert(String arg0,String arg1,String arg2,String table){
        db = helper.getWritableDatabase();
        String sql="INSERT INTO "+table+"(arg0,arg1,arg2) VALUES ('"+arg0+"', '"+arg1+"', '"+arg2+"');";
        db.execSQL(sql);
    }
}
cs


여기서 sql문은 본인이 짠 테이블정보에 맞게 사용하시면 됩니다.


frag1에서 액티비티에 정의 해놓은 insert 함수를 사용 할 것입니다.


Frag1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Frag1 extends Fragment {
    View view;
    InsertDB in;
 
    @Override
    public void onAttach(Activity activity){
    super.onAttach(activity);
    in = (InsertDB)activity;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.frag1, container, false);
        in.insert("arg0","arg1","arg2","table");
 
        return view;
    }
}
cs


onAttach는 생명주기에서 프래그먼트가 액티비티에 추가될때 호출됩니다.

매개변수인 액티비티는 추가된 액티비티가 들어오는데, 해당 액티비티에 정의된 인터페이스를 가지고 객체를 만들어서 사용하면 됩니다.


예제에서는 특정 작업을 하도록 했지만, 이를 응용 하면 이뿐만 아니라 액티비티클래스의  필드를 가져올수도 있고, 활용법이 많습니다.




희 위미르에서는 모바일 어플리케이션(Android/iOS), Web 개발을 해드리고 있습니다.


문의 전화 : 070-4177-3962

Comments