2015-08-25 2 views
1

Так что я искал часы, пытаясь найти ответ на эту конкретную проблему, с которой мне не повезло. Было бы здорово, если кто-то сможет мне помочь.Динамически создавая два фрагмента, которые различают два в одних и тех же действиях

По существу у меня есть MainActivity.java, FragmentA.java, activity_main.xml и fragment.xml. Так что у файла fragment.xml есть только контейнер, в котором есть 3 кнопки в окне, которое при нажатии «Пуск» показывает номер, начинающийся с 3 в виде текста кнопок. Поэтому, когда вы снова нажимаете кнопку, она меняет текст кнопки на 2, а затем 1, а затем 0, а затем обратно на 3. Вся логика, которая уменьшает номера и изменяет текст кнопки на это число, находится в классе FragmentA.java. Вся эта логика работает, я ее протестировал. Наконец, я создаю и добавляю FragmentA динамически в Activity_main.xml LinearLayout MainActivity, когда нажата кнопка добавления на панели действий.

Итак, теперь, когда вы нажимаете кнопку добавления на панели действий в MainActivity, представление fragment.xml правильно добавляется к LinearLayout activity_main.xml. Проблема в том, что только первый фрагмент, добавленный в LinearLayout, работает (число уменьшается) при нажатии кнопки. Другие фрагментные копии не работают или ничего не делают, а просто показывают. Таким образом, логика декремента кнопок работает только для первого добавленного вида. Почему это? Я думал, что фрагмент фрагментации заключается в устранении дублирования. Я предполагаю, что это проблема с идентификатором, когда один и тот же фрагмент создается несколько раз? Любая идея о том, как это исправить?

FragmentA.java

Button b1, b2, b3; 
int[] mCounter = {3, 3, 3}; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment, null); 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    b1 = (Button) getActivity().findViewById(R.id.button); 
    b1.setOnClickListener(this); 
    b2 = (Button) getActivity().findViewById(R.id.button2); 
    b2.setOnClickListener(this); 
    b3 = (Button) getActivity().findViewById(R.id.button3); 
    b3.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    switch(v.getId()) { 
     case R.id.button: 
      b1.setText(Integer.toString(mCounter[0])); 
      decrementCounterByButtonPosition(0); 
      break; 
     case R.id.button2: 
      b2.setText(Integer.toString(mCounter[1])); 
      decrementCounterByButtonPosition(1); 
      break; 
     case R.id.button3: 
      b3.setText(Integer.toString(mCounter[2])); 
      decrementCounterByButtonPosition(2); 
      break; 
    } 
} 

public void decrementCounterByButtonPosition(int counterId) { 
    if (mCounter[counterId] != 0) { 
     mCounter[counterId]--; 
    } else { 
     mCounter[counterId] = 3; 
    } 
} 

MainActivity.java

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

@Override 
public boolean onCreateOptionsMenu(Menu menu) {   
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_add_exercise) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     FragmentA ContainerFragment = new FragmentA(); 
      fragmentTransaction.add(R.id.container, ContainerFragment, "HELLO"); 
     fragmentTransaction.commit(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

activity_main.xml

<ScrollView 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="match_parent" 
android:background="#1FDA9A"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" 
    android:orientation="vertical" 
    android:id="@+id/container"> 
</LinearLayout> 

fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:paddingTop="0dp" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" > 

<LinearLayout 
    android:id="@+id/globalContainer" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="10dp"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="80dp" 
     android:background="#fff" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:backgroundTint="#333" 
     android:gravity="center_vertical|center_horizontal"> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/button" 
      android:maxWidth="10dp" 
      android:maxHeight="10dp" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" /> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/button2" 
      android:maxWidth="10dp" 
      android:maxHeight="10dp" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" /> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/button3" 
      android:maxWidth="10dp" 
      android:maxHeight="10dp" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" /> 
    </LinearLayout> 
</LinearLayout> 

Любая помощь приветствуется. Спасибо: D

ответ

2

В дополнение к ответу Абдуллы Асендера, у вас есть еще одна вещь, которую нужно исправить.

Проблема заключается в том, как вы получаете свои взгляды.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    b1 = (Button) getActivity().findViewById(R.id.button); 
    b1.setOnClickListener(this); 
    b2 = (Button) getActivity().findViewById(R.id.button2); 
    b2.setOnClickListener(this); 
    b3 = (Button) getActivity().findViewById(R.id.button3); 
    b3.setOnClickListener(this); 
} 

Это находит виды из Деятельности, а не из вашего фрагмента.

Правильный способ сделать это:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment, container, false); 
    b1 = (Button) v.findViewById(R.id.button); 
    b1.setOnClickListener(this); 
    b2 = (Button) v.findViewById(R.id.button2); 
    b2.setOnClickListener(this); 
    b3 = (Button) v.findViewById(R.id.button3); 
    b3.setOnClickListener(this); 
    return v; 
} 

и не избавиться от onActivityCreated переопределения, потому что он больше не делает ничего особенного.

уведомление тонкое изменение View v = inflater.inflate(R.layout.fragment, container, false);

+0

только то, что мне нужно !!! : D – user2976493

2

Я не совсем уверен, но я думаю, что проблема в ContainerFragment Object

FragmentA ContainerFragment = new Fragment();

пытаются изменить его на:

FragmentA ContainerFragment = new FragmentA();

если вы можете Не проезжайте объект fragmentTransaction.add Сделайте это:

android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 
android.support.v4.app.FragmentTransaction fragmentTransaction = 
                 fragmentManager.beginTransaction(); 

Надеюсь, это поможет.

+0

Спасибо за ответ Абдуллы! Так что на самом деле это должно быть «= new FragmentA()», у меня просто была опечатка, когда я разместил этот вопрос. Но в любом случае ... это, похоже, ничего не делает. – user2976493

+0

Oh ,,, так или иначе я рад, что ваша проблема исправлена ​​ –

Смежные вопросы