/*!
* 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;
}
};
Фрагмент, объявленный в макете, по-разному обрабатывается 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
по вашему выбору и программно обработайте все транзакции. Остальное выглядит хорошо для меня
, когда я перехожу в NewFragment, как я удаляю первый экран frament?
blockquote> blockquote>хорошо, вы можете это сделать, спрятав старый (первый)
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 всегда опаздывает на сторону (:
скопировать и вставить код в событие нажатия кнопки.
fr = new FirstFragment();
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
это завершена работа.
Лучше использовать viewGroup или макет / FrameLayout вместо фрагментов (перемещение фрагментов на нажатия кнопок в Activity). Поскольку фрагменты имеют свой собственный жизненный цикл и фрагмент, удерживают их или не убивают, когда вы выполняете переход фрагмента в рамках действия.
Хотя, если вы все еще хотите пойти с фрагментом, сначала загрузите фрагмент первого нажатия кнопки и обрабатывать события щелчка других двух кнопок, удаляя ранее прикрепленный фрагмент (Фрагмент прикреплен к первому нажатию кнопки).
Это можно сделать:
getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();
, после чего вы может написать код для добавления фрагмента в этом месте, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();
и, следовательно, это можно сделать для третьего нажатия кнопки, просто нужно изменить фрагмент, прикрепленный ко второй кнопке.
Надеюсь, это поможет вы.
вы можете использовать: getSupportFragmentManager().beginTransaction().remove(fragment).commit();
Надеюсь, это поможет.
Фрагменты, жестко закодированные в 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.");
}
}
Надеюсь, это поможет.
Внесите необходимые изменения. Замените свою активность и 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/>