Android 保存碎片的状态?
我正在尝试实现多个片段。每个片段都在活动中查看,当我单击底部导航按钮时,活动会发生更改或被替换。 我们能够将数据从frag1传递到frag2,但是,如果我单击frag2或任何其他片段按钮,导航栏(即此处的流栏)将重置,数据将丢失 以下是我自己尝试过的:我在第二个片段中实现了onSaveInstanceState,但是没有任何用处。不知怎的,这个片段是新创建的 还尝试了上述解决方案 这里是布局图 主要活动Android 保存碎片的状态?,android,android-studio,android-fragments,bottomnavigationview,onsaveinstancestate,Android,Android Studio,Android Fragments,Bottomnavigationview,Onsaveinstancestate,我正在尝试实现多个片段。每个片段都在活动中查看,当我单击底部导航按钮时,活动会发生更改或被替换。 我们能够将数据从frag1传递到frag2,但是,如果我单击frag2或任何其他片段按钮,导航栏(即此处的流栏)将重置,数据将丢失 以下是我自己尝试过的:我在第二个片段中实现了onSaveInstanceState,但是没有任何用处。不知怎的,这个片段是新创建的 还尝试了上述解决方案 这里是布局图 主要活动 import android.graphics.drawable.Drawable; im
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.br.tron.bottombar.RadioFragment;
import com.br.tron.bottombar.StreamFragment;
import com.br.tron.bottombar.InfoFragment;
public class MainActivity extends AppCompatActivity implements PushStreamLink{
BottomNavigationView bottomNavigationView;
private Fragment fragment;
private FragmentManager fragmentManager;
View view;
//private FragmentTransaction transaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
fragment = new RadioFragment();
fragment.setRetainInstance(true);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, fragment).commit();
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationBar);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener(){
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
String tag = "";
switch (item.getItemId()) {
case R.id.nav_button_one:
fragment = new RadioFragment();
fragment.setRetainInstance(true);
tag = "radio_fragment";
break;
case R.id.nav_button_two:
fragment = new StreamFragment();
fragment.setRetainInstance(true);
tag = "stream_fragment";
break;
case R.id.nav_button_three:
fragment = new InfoFragment();
fragment.setRetainInstance(true);
tag = "info_fragment";
break;
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, fragment, tag).commit();
return true;
}
});
}
@Override
public void sendStreamLink(String link) {
fragment =new StreamFragment();
fragment.setRetainInstance(true);
fragmentManager=getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, fragment,"stream_fragment").addToBackStack(null).commit();
getSupportFragmentManager().executePendingTransactions();
StreamFragment sf=(StreamFragment) getSupportFragmentManager().findFragmentByTag("stream_fragment");
sf.getUrl(link);
view = bottomNavigationView.findViewById(R.id.nav_button_two);
view.performClick();
}
}
RadioFragment(我从中发送数据的碎片)
StreamFragment(接收数据但未保存在视图中的frag)
而不是
case R.id.nav_button_three:
fragment = new InfoFragment();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, fragment, tag).commit();
创建实例,例如:
private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
在MainActivity OnCreate()方法上创建片段管理器和所有片段,例如:
private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
然后添加方法:
public void loadFragment(Fragment fragment) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.addToBackStack(null)
.commit();
}
然后单击“加载所需片段”:
case R.id.nav_button_three:
loadFragment(myFragment);
而不是
case R.id.nav_button_three:
fragment = new InfoFragment();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, fragment, tag).commit();
创建实例,例如:
private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
在MainActivity OnCreate()方法上创建片段管理器和所有片段,例如:
private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
然后添加方法:
public void loadFragment(Fragment fragment) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.addToBackStack(null)
.commit();
}
然后单击“加载所需片段”:
case R.id.nav_button_three:
loadFragment(myFragment);
所以你是说我应该分别为这三个片段创建实例??你的解决方案给了我类强制转换异常错误java.lang.ClassCastException:com.br.tron.bottombar.RadioFragment不能强制转换为com.br.tron.bottombar.StreamFragments,而不是fragmentManager=getFragmentManager();使用fragmentManager=getSupportFragmentManager();因为正如我看到的,你改进了这一点:导入android.support.v4.app.Fragment;如果您可以看到我已经在使用fragmentManager=getSupportFragmentManager()的代码;我的实现中没有错误。。。只是片段的前一个状态没有得到恢复,所以你是说我应该分别为所有三个片段创建实例??你的解决方案给了我类强制转换异常错误java.lang.ClassCastException:com.br.tron.bottombar.RadioFragment不能强制转换为com.br.tron.bottombar.StreamFragments,而不是fragmentManager=getFragmentManager();使用fragmentManager=getSupportFragmentManager();因为正如我看到的,你改进了这一点:导入android.support.v4.app.Fragment;如果您可以看到我已经在使用fragmentManager=getSupportFragmentManager()的代码;我的实现中没有错误。。。只是碎片之前的状态没有恢复一些人能帮我吗?一些人能帮我吗?