使用FAB按钮,该应用程序在两个片段之间交替使用。我试图使当前的片段在旋转屏幕时保持不变,但每次屏幕旋转时,应用程序就会崩溃。我尝试了许多解决方案,但都没有奏效。它为什么要崩溃?我正在使用NetBeans,所以我不确定谁应该发布日志。
public class agendaFalante extends AppCompatActivity
{
/** Called when the activity is first created. */
private Toolbar toolbar;
private FloatingActionButton fab ;
private listViewFrag lvfrag;
private newEventFrag nef;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toolbar = (Toolbar) findViewById (R.id.toolbar);
setSupportActionBar(toolbar);
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
if (savedInstanceState == null) {
lvfrag = new listViewFrag();
fragmentTransaction.replace(R.id.ll, lvfrag, "lvfrag");
fragmentTransaction.commit();
}else{
if(lvfrag!=null && lvfrag.isVisible()){
fragmentTransaction.replace(R.id.ll, lvfrag);
fragmentTransaction.commit();
}else if(nef!=null && nef.isVisible()){
fragmentTransaction.replace(R.id.ll, nef);
fragmentTransaction.commit();
}
}
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
fragmentTransaction = fragmentManager.beginTransaction();
if(nef!=null && nef.isVisible()){
lvfrag = (listViewFrag) getSupportFragmentManager().findFragmentByTag("lvfrag");
fragmentTransaction.replace(R.id.ll,lvfrag);
}else{
if(lvfrag.isVisible()){
nef = (newEventFrag) getSupportFragmentManager().findFragmentByTag("nef");
if(nef==null){
nef = new newEventFrag();
fragmentTransaction.replace(R.id.ll,nef,"nef");
}else{
fragmentTransaction.replace(R.id.ll,nef);
}
}
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
}
public boolean OnCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu_layout,menu);
return true;
}
}
主xml
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root"
tools:context=".agendaFalante">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ll"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
android:elevation="6dp"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
</LinearLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:clickable="true"
android:src="@drawable/ic_done"
app:layout_anchor="@id/ll"
app:backgroundTint="#CE93D8"
app:layout_anchorGravity="bottom|right|end"/>
</android.support.design.widget.CoordinatorLayout>
片段1 xml
public class listViewFrag extends Fragment{
private ListView atividadesView;
private ArrayList<String> alist;
private ArrayAdapter<String> aDapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.listviewfrag, container, false);
atividadesView = (ListView) view.findViewById(R.id.listView);
alist = new ArrayList<String>();
alist.add("oi");
aDapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,alist);
atividadesView.setAdapter(aDapter);
return view;
}
public void addText(String text){
alist.add(text);
aDapter.notifyDataSetChanged();
}
}
片段xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
第2段:
public class newEventFrag extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.neweventfrag, container, false);
return view;
}
}
片段xml
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
>
<TableRow
android:layout_height="0dp"
android:layout_weight="1">
<EditText
android:text="Insira o título"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.8"
>
</EditText>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:id="@+id/record"
android:src="@drawable/ic_mic"
>
</Button>
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight="1">
<DatePicker
android:id="@+id/dpResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:datePickerMode="spinner"
android:calendarViewShown="false"
/>
</TableRow>
</TableLayout>
发布于 2015-10-21 21:44:38
当屏幕旋转时,onCreate()
中的onCreate()
参数将包含一个Bundle
,允许您将Activity
返回到它所处的状态。但您仍然需要将其视为全新的Activity
,并再次加载所有控件:
if (savedInstanceState == null) {
lvfrag = new listViewFrag();
fragmentTransaction.replace(R.id.ll, lvfrag, "lvfrag");
fragmentTransaction.commit();
} else {
// even though savedInstanceState is not null
// lvfrag still needs to be created
if(lvfrag.isVisible()){
我已经向您展示了上面代码的一部分--在其中,假设如果lvfrag
不是null,就已经创建了savedInstanceState
--这是错误的。
每次屏幕旋转时,Android都会从new重新创建您的活动--您必须重新创建任何片段(和任何其他控件),并重新初始化活动中的所有字段。您的应用程序崩溃的最可能原因是,当lvfrag.isVisible()
尚未初始化时(所以是null),您试图调用lvfrag
。
发布于 2015-10-21 22:19:07
屏幕旋转时,屏幕上的碎片不会被破坏。但是,在找到片段并将其分配给字段之前,字段lvfrag将不是您在旋转之前创建的片段。因此,当savedInstanceState不是null时,首先应该“查找”片段。
if (savedInstanceState == null) {
lvfrag = new listViewFrag();
fragmentTransaction.replace(R.id.ll, lvfrag, "lvfrag");
fragmentTransaction.commit();
}else{
lvfrag = (listViewFrag)this.getSupportFragmentManager().findFragmentByTag("lvfrag");
if(lvfrag!=null)
……您将需要重置任何片段的字段,然后在这里替换并再次提交}
我在这里只显示lvfrag,但是您也可以为nef做包含的代码。您的mainActivity需要知道在活动被销毁时哪个片段是可见的。您应该重写一个onSaveInstanceState方法来发送返回,当活动在旋转时被破坏时,哪个框架在包中是可见的,然后在替换片段时捕获它。
发布于 2020-04-17 19:11:02
在您的android:configChanges="orientation|screenSize|keyboardHidden"
上写上一行::AndroidManifest.xml
,在其中添加片段的活动。
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
https://stackoverflow.com/questions/33269605
复制相似问题