Android

안드로이드 프레그먼트 <-> 엑티비티

Machine_웅 2018. 7. 22. 14:34
728x90
반응형

android:id="@+id/tv_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 영역"
android:textColor="#FFFFFF"
android:textSize="30dp"
/>
<Button
android:id="@+id/btn_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity의 TextView에 접근"
android:textColor="#000000"
/>
</LinearLayout>



[MainActivity.java]

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
LinearLayout ll_fragment;
TextView tv_activity;
Button btn_activity;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll_fragment = (LinearLayout)findViewById(R.id.ll_fragment);
tv_activity = (TextView)findViewById(R.id.tv_activity);
btn_activity = (Button)findViewById(R.id.btn_activity);


btn_activity.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);
mainFragment.changeFragmentTextView("호호호");

}
});
replaceFragment();
}

public void replaceFragment()
{
MainFragment mainFragment = new MainFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ll_fragment, mainFragment);
fragmentTransaction.commit();
}

public void changeText(String text)
{
tv_activity.setText(text);
}
}


[MainFragment.java]

public class MainFragment extends Fragment
{
TextView tv_fragment;
Button btn_fragment;
public MainFragment()
{
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_main, container, false);
tv_fragment = (TextView)view.findViewById(R.id.tv_fragment);
btn_fragment = (Button)view.findViewById(R.id.btn_fragment);

btn_fragment.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((MainActivity)getActivity()).changeText("하하하");
}
});
return view;
}

public void changeFragmentTextView(String text)
{
tv_fragment.setText(text);
}
}



Fragment에서 Activity 접근


이 부분은 검색하면

바로 나오는 부분이기도 하고


예전에 따로 이와 관련된

글을 살짝 썼던 기억이 있습니다.


접근하는 방법

Fragment에서


((MainActivity)getActivity).변수

((MainActivity)getActivity).메서드


위 코드를 보면

Fragment에서 버튼을 눌렀을때

Activity에 존재하는 메서드에

접근을 하였습니다.

        btn_fragment.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((MainActivity)getActivity()).changeText("하하하");
}
});


Activity의 changeText라는

메서드에 "하하하"라는 String을

넘겨주었습니다.


Activity의 changeText 메서드를 보면

 public void changeText(String text)
{
tv_activity.setText(text);
}


Fragment에서 넘어온 String값을

받아서 Activity에 있는 TextView에

setText값으로 넣어주는 것을

확인 할 수 있습니다.



Activity에서 Fragment 접근


이 부분은

위에 있는 Fragment에서 Activity접근하기

보다는 덜 사용해서 그런지..


모르시는 분들이 은근히 많습니다.


제가 만들고 있는 앱에서도

이 부분을 사용하기는 하는데

특수한 상황에서 사용하고 있습니다.

(설명하기에는 너무 애매한 경우라 또. ㅎㅎ)


코드를 보면

        btn_activity.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);
mainFragment.changeFragmentTextView("호호호");

}
});


1줄 더 늘었지만

역시 어렵지는 않습니다.


첫번째 줄이 그나마

생소한 코드일 수 있습니다.

MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.ll_fragment);


이 부분인데 아마

findFragmentById의 id가

어떤건지 헷갈릴수도 있습니다.


이 id는

Fragment 교체할때의

Layout영역입니다.

    public void replaceFragment()
{
MainFragment mainFragment = new MainFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ll_fragment, mainFragment);
fragmentTransaction.commit();
}

이 부분이 되겠습니다!



출처: http://itpangpang.xyz/309 [ITPangPang]

출처: http://itpangpang.xyz/309 [ITPangPang]

728x90
반응형