2016-08-30 2 views
0

Я добавляю два фрагмента в свою деятельность, фрагмент1 содержит кнопку, а фрагмент2 содержит TextView, когда я нажимаю кнопку в фрагменте1, счетчик увеличивается и показывает результат в TextView фрагмента2. Я занимаюсь saveInstanceState и сохраняю счетчик и текст в случае поворота экрана. Но все же ошибка там .............. Ошибка при запуске приложения, он работал нормально, но как только я поворачиваю экран, метод onclick не вызывает вообще. Я застрял здесь, пожалуйста, помогите.onClickListener не работает должным образом во фрагменте

public class FragmentA extends Fragment{ 

Button button; 
int counter; 
Communicator communicator; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_a,container,false); 
    button = (Button) view.findViewById(R.id.button); 
    if(savedInstanceState == null) 
     counter = 0; 
    else{ 
     counter = savedInstanceState.getInt("Counter",0); 
    } 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      counter++; 
      communicator.respond("Button was clicked "+counter+ " times"); 
     } 
    }); 
    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("Counter",counter); 
} 

public void setCommunicator(Communicator communicator){ 
    this.communicator = communicator; 
} 

interface Communicator{ 
    public void respond(String data); 
} 

}

Я попробовал оба варианта связывания кнопки с слушателя в onCreateView() и onActivityCreate кнопку() вопрос есть.

public class FragmentB extends Fragment{ 

TextView textView; 
String data; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_b, container, false); 
    if (savedInstanceState != null) { 
     textView = (TextView) view.findViewById(R.id.textView); 
     data = savedInstanceState.getString("text"); 
     textView.setText(data); 
    } 
    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    textView = (TextView) getActivity().findViewById(R.id.textView); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("text", data); 
} 

public void changeData(String data){ 
    this.data = data; 
    textView.setText(data); 
} 

}

это деятельность, где я использую эти фрагменты ....

public class MainActivity extends AppCompatActivity implements FragmentA.Communicator{ 

FragmentManager fragmentManager; 
FragmentTransaction fragmentTransaction; 
FragmentA fragmentA; 
FragmentB fragmentB; 


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

    fragmentManager = getFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentA = new FragmentA(); 
    fragmentB = new FragmentB(); 

    fragmentTransaction.add(R.id.fragment_container1,fragmentA,"Najam"); 
    fragmentTransaction.add(R.id.fragment_container2,fragmentB,"Najam"); 
    fragmentTransaction.commit(); 
    fragmentA.setCommunicator(this); 
} 

@Override 
public void respond(String data) { 
    //set the text of fragment_B 
    fragmentB.changeData(data); 
} 

}

Вот простые XML файлы

Это для фрагмента А

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00FFB0"> 

    <Button 
     android:layout_margin="10dp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Click me" 
     android:id="@+id/button" /> 
</LinearLayout> 

Это для fragmentB

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#AAA333"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_margin="10dp" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="you clicked the button 0 times" 
     android:id="@+id/textView" /> 
</LinearLayout> 

Это является деятельность

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:background="#FFBB00" 
    android:id="@+id/main_layout" 
    tools:context="com.najam.fragments1.MainActivity"> 

    <FrameLayout android:id="@+id/fragment_container1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
    <FrameLayout android:id="@+id/fragment_container2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 
+0

Возможный дубликат [Метод вызывает на вращение андроида экрана] (http://stackoverflow.com/questions/36112869/method-calls-on-android-screen-rotation) – karan

+0

Как вы инициализации 'коммуникатором '? Не удается найти код, который это делает. – Egor

+0

Спасибо @karan, но я боюсь, что решение не так. – Najam

ответ

0

Используйте фрагмент в FrameLayout. Попробуйте следующее. Вы можете соответствующим образом отрегулировать положение кадров и фрагментов. У меня есть полные рабочие источники той же проблемы. Сообщите мне, если потребуется.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.najam.fragments1.MainActivity"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_weight="1" 
     android:background="#99CC00" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginBottom="102dp" 
     android:layout_below="@+id/frameLayout2"> 

     <fragment 
      android:layout_width="match_parent" 
      android:layout_height="152dp" 
      android:name="com.najam.fragments2" 
      android:id="@+id/fragmentb" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="66dp" 
      tools:layout="@layout/fragment_container2" /> 
    </FrameLayout> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/holo_blue_light"> 

     <fragment 
      android:layout_width="match_parent" 
      android:layout_height="228dp" 
      android:name="com.najam.fragments1" 
      android:id="@+id/fragmenta" 
      android:layout_centerVertical="true" 
      android:layout_alignParentStart="true" 
      tools:layout="@layout/fragment_container1" /> 
    </FrameLayout> 
</RelativeLayout> 
Смежные вопросы