Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit
Добавлено: 01 дек 2014, 14:10
почему избегаешь активити?finberg писал(а):Pedro Sancez писал(а): без участии активити
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
почему избегаешь активити?finberg писал(а):Pedro Sancez писал(а): без участии активити
Код: Выделить всё
public class MainActivity extends Activity {
private Fragment fragment1, fragment2,fragment3;
private FragmentTransaction ft;
Button btn;
MyHelper my;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my = new MyHelper(this);
SQLiteDatabase db= my.getWritableDatabase();
fragment1= new Fragment1();
fragment2= new Fragment2();
fragment3= new Fragment3();
ft = getFragmentManager().beginTransaction();
//ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.replace(R.id.fragCont, fragment1);
ft.addToBackStack(null);
ft.commit();
btn =(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ft = getFragmentManager().beginTransaction();
//ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if(fragment1.isVisible()){
ft.replace(R.id.fragCont, fragment2);
}
if (fragment2.isVisible())
{
ft.replace(R.id.fragCont, fragment3);
}
if (fragment3.isVisible()) {
ft.replace(R.id.fragCont, fragment1);
}
ft.commit();
}
});
}
Код: Выделить всё
public class Fragment3 extends Fragment {
ListView lv;
SQLiteDatabase db;
ArrayList<String> str;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.fragment3, null);
db = MainActivity.dbh.getWritableDatabase();
str = new ArrayList<String>();
Cursor c = db.query("mytable",null,null,null,null,null,null);
if(c.moveToFirst()){
int nameColIndex = c.getColumnIndex("login");
int passColIndex = c.getColumnIndex("password");
do {
String name=c.getString(nameColIndex);
String pass=c.getString(passColIndex);
str.add(name);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, str);
lv.setAdapter(dataAdapter);
}
while(c.moveToNext());
}
return v;
}
}
Код: Выделить всё
@Override
public void someEvent(String s) {
final Fragment frag2 = getFragmentManager().findFragmentById(R.id.fragment2);
final WebView web = ((WebView) frag2.getView().findViewById(R.id.webView));
web.loadURL(s);
}
Код: Выделить всё
public class Fragment2 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment2, null);
return v;
}
}
Код: Выделить всё
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментахMikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.chasovoy писал(а):Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментахMikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Потому что у вас интерфейс OnClickListener определён для активности, а не для фрагмента. Сделайте его и для фрагментаchasovoy писал(а):Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментахMikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.
По хорошему такую картинку нужно на весь андроид налепить. Фрагменты сами по себе велосипед велосипедный. Чего только стоит куча АПИ версий совместимость которых поддерживается вермишелью из саппорт костылей. Так что для андроида это нормально.Mikhail_dev писал(а):Потому что у вас интерфейс OnClickListener определён для активности, а не для фрагмента. Сделайте его и для фрагментаchasovoy писал(а):Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментахMikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.
Изначально же не было планшетов, и только после их появления добавили фрагменты. Фрагмент просто надстройка над активити. По поводу имплементации это еще нужно как-то объяснить новичку.Mikhail_dev писал(а):Нет, ненормально. Не надо мешать багнутый андроид и сильносвязанную архитектуру. Код должен писаться на интерфейсах и не должен зависеть друг с другом. Это относится к любому коду.
А что не так с фрагментами? Саппорт либа да, та еще морока.
Код: Выделить всё
public interface onMainMenuListener
{
public void onButtonClickEvent(int i);
}
onMainMenuListener mainMenuListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
Activity activity;
if (context instanceof Activity){
activity=(Activity) context;
mainMenuListener = (onMainMenuListener) activity;
}
}
catch (ClassCastException e)
{
throw new ClassCastException(context.toString()+" must implement onMainMenuListener");
}
}
Код: Выделить всё
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.mainmenu_fragment,container,false);
Button trainButton = (Button) v.findViewById(R.id.button_train);
trainButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
[color=#BF0000]mainMenuListener.onButtonClickEvent(1);[/color]
}
});
Button youtubeButton = (Button) v.findViewById(R.id.button_youtube);
youtubeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
[color=#BF0000]mainMenuListener.onButtonClickEvent(2);[/color]
}
});
return v;
}