Fragmenttransaction, остаток предыдущего фрагмента [дубликат]

/*!
 * reads binary data into the string.
 * @status : OK.
*/

class UReadBinaryString
{
    static std::string read(std::istream &is, uint32_t size)
    {
        std::string returnStr;
        if(size > 0)
        {
            CWrapPtr<char> buff(new char[size]);       // custom smart pointer
            is.read(reinterpret_cast<char*>(buff.m_obj), size);
            returnStr.assign(buff.m_obj, size);
        }

        return returnStr;
    }
};

class objHeader
{
public:
    std::string m_ID;

    // serialize
    std::ostream &operator << (std::ostream &os)
    {
        uint32_t size = (m_ID.length());
        os.write(reinterpret_cast<char*>(&size), sizeof(uint32_t));
        os.write(m_ID.c_str(), size);

        return os;
    }
    // de-serialize
    std::istream &operator >> (std::istream &is)
    {
        uint32_t size;
        is.read(reinterpret_cast<char*>(&size), sizeof(uint32_t));
        m_ID = UReadBinaryString::read(is, size);

        return is;
     }
};
10
задан jarlh 7 May 2015 в 07:21
поделиться

7 ответов

Фрагмент, объявленный в макете, по-разному обрабатывается Android. Замените

 <fragment
     android:id="@+id/fragment_place"
     android:name="packagename.FirstFragment"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_weight="0.87"/> 

на FrameLayout или подкласс ViewGroup по вашему выбору и программно обработайте все транзакции. Остальное выглядит хорошо для меня

13
ответ дан Blackbelt 16 August 2018 в 00:43
поделиться

, когда я перехожу в NewFragment, как я удаляю первый экран frament?

хорошо, вы можете это сделать, спрятав старый (первый) Fragment источник

getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager()
                      .findFragmentById(R.id.the_id_of_my_first_fragment));

, вы можете также получить его (первый фрагмент) обратно тем же способом source

getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager()
                      .findFragmentById(R.id.the_id_of_my_first_fragment));

Этот подход покупает гибкость и не изменяет архитектуру вашего приложения и логику, а также один line of work

im всегда опаздывает на сторону (:

0
ответ дан Elltz 16 August 2018 в 00:43
поделиться

скопировать и вставить код в событие нажатия кнопки.

fr = new FirstFragment();  
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);                                         
fragmentTransaction.commit();

это завершена работа.

-1
ответ дан Hardik Parmar 16 August 2018 в 00:43
поделиться

Лучше использовать viewGroup или макет / FrameLayout вместо фрагментов (перемещение фрагментов на нажатия кнопок в Activity). Поскольку фрагменты имеют свой собственный жизненный цикл и фрагмент, удерживают их или не убивают, когда вы выполняете переход фрагмента в рамках действия.

Хотя, если вы все еще хотите пойти с фрагментом, сначала загрузите фрагмент первого нажатия кнопки и обрабатывать события щелчка других двух кнопок, удаляя ранее прикрепленный фрагмент (Фрагмент прикреплен к первому нажатию кнопки).

Это можно сделать:

getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();

, после чего вы может написать код для добавления фрагмента в этом месте, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit(); и, следовательно, это можно сделать для третьего нажатия кнопки, просто нужно изменить фрагмент, прикрепленный ко второй кнопке.

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

4
ответ дан Ravi Kabra 16 August 2018 в 00:43
поделиться

вы можете использовать: getSupportFragmentManager().beginTransaction().remove(fragment).commit(); Надеюсь, это поможет.

0
ответ дан Sanie 16 August 2018 в 00:43
поделиться
  • 1
    привет @ahmad Alsanie, пожалуйста, см. мой отредактированный вопрос – Joseph Mekwan 22 April 2015 в 12:23

Фрагменты, жестко закодированные в XML, не могут быть заменены. Вместо этого используйте FramLayout в качестве контейнера фрагмента.

в вашем XML замените

<fragment
     android:id="@+id/fragment_place"
     android:name="packagename.FirstFragment"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_weight="0.87"/>       
   <LinearLayout/>

на

<FrameLayout
     android:id="@+id/contentFragment"
     android:layout_width="match_parent"
     android:layout_height="0px"
     android:layout_weight="2" />

Теперь, следуйте следующему стилю кода, чтобы достичь своей цели:

Сначала установите onClickListeners на все изображения: например: imgOne.setOnClickListener(this);

            @Override
            public void onClick(View v) {
                Fragment fragment = null;
                switch (v.getId()) {
                    case R.id.imgOne:
                        fragment = new Fragment1();
                        break;
                    case R.id.imgTwo:
                        fragment = new Fragment2();
                        break;
                }
                if (fragment != null) {
                    FragmentManager fm = getSupportFragmentManager();
                    fm.beginTransaction().replace(R.id.contentFragment, fragment).commit();                        
                } else {
                    Log.e(LOG_TAG, "Error in fragment transaction.");
                }
            }

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

1
ответ дан Wizard 16 August 2018 в 00:43
поделиться

Внесите необходимые изменения. Замените свою активность и xml на это.

public class MasterActivity extends Activity {                
ImageView imgOne, imgTwo, imgThree;
Fragment fr;                                              

@Override                                                 
protected void onCreate(Bundle savedInstanceState) {      
super.onCreate(savedInstanceState);                   

setContentView(R.layout.activity_master);             

imgOne = (ImageView) findViewById(R.id.imgOne);       
imgTwo = (ImageView) findViewById(R.id.imgTwo);       
imgThree = (ImageView) findViewById(R.id.imgThree);

getFragmentManager().beginTransaction().add(R.id.fragment_place, new FirstFragment()).commit();


imgOne.setOnClickListener(new View.OnClickListener() {                                                
    @Override                                                                                         
    public void onClick(View v) {    
        getFragmentManager().beginTransaction().replace(R.id.fragment_place, new FirstFragment()).commit();
    }                                                                                                 
});                                                                                                   

imgTwo.setOnClickListener(new View.OnClickListener() {
    @Override                                                                                         
    public void onClick(View v) {                                                                     
        getFragmentManager().beginTransaction().replace(R.id.fragment_place, new SecondFragment()).commit();                                                               
    }
});  

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#000000"
android:gravity="bottom"
android:weightSum="3" >

<ImageView
    android:id="@+id/imgOne"
    android:layout_width="0dp"
    android:layout_height="27dp"
    android:layout_gravity="center"
    android:layout_weight="1"
    android:src="@drawable/img1" />

<ImageView
    android:id="@+id/imgTwo"
    android:layout_width="0dp"
    android:layout_gravity="center"
    android:layout_height="27dp"
    android:layout_weight="1"
    android:src="@drawable/img2"/>
<ImageView
    android:id="@+id/imgThree"
    android:layout_width="0dp"
    android:layout_gravity="center"
    android:layout_height="27dp"
    android:layout_weight="1"
    android:src="@drawable/img3" />
</LinearLayout>

 <FrameLayout
 android:id="@+id/fragment_place"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_weight="0.87"/>       
 <LinearLayout/>
 <LinearLayout/>
0
ответ дан Xjasz 16 August 2018 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: