重新启动应用程序后,android textview会加倍/镜像/屏蔽
这是在以下情况下发生的: 1) 我打开我的应用程序,执行一些常规操作。 2) 关闭我的应用程序(清除碎片和活动)。 3) 从应用程序抽屉重新打开我的应用程序 我觉得这是我在生命周期事件中正在做的事情。 有人遇到过吗?怎么了 活动代码(视图初始化) 片段代码重新启动应用程序后,android textview会加倍/镜像/屏蔽,android,textview,Android,Textview,这是在以下情况下发生的: 1) 我打开我的应用程序,执行一些常规操作。 2) 关闭我的应用程序(清除碎片和活动)。 3) 从应用程序抽屉重新打开我的应用程序 我觉得这是我在生命周期事件中正在做的事情。 有人遇到过吗?怎么了 活动代码(视图初始化) 片段代码 public class Play_Main extends Fragment implements IListener { private static final String TAG = "Play_Main_Fragment
public class Play_Main extends Fragment implements IListener {
private static final String TAG = "Play_Main_Fragment";
public static CountDownLatch mCountDown = new CountDownLatch(1);
private Typeface roboto;
// Views
private TextView tv1;
private TextView pullToConnect;
private Button connectButton;
private SwipeRefreshLayout mSwipeLayout;
// Object Instances
private Play_Main mainFrag;
private MessageManager messageManager;
// Animation
private Animation fadeIn;
private Animation fadeOut;
// Fields
private String isConnectedText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_ui_frame, container, false);
super.onCreateView(inflater, container, null);
mainFrag = this;
final Gson jsonMaker = new Gson();
roboto = Typeface.createFromAsset(getActivity().getAssets(), "fonts/robotot.ttf");
fadeOut = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_out);
fadeIn = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_in);
messageManager = MessageManager.Instance();
// Register as a general listener
messageManager.RegisterListener(mainFrag);
// Register as the UI to interact with
messageManager.registerUI(mainFrag);
pullToConnect = (TextView) view.findViewById(R.id.pullToConnect);
pullToConnect.setTypeface(roboto);
tv1 = (TextView) view.findViewById(R.id.tv1);
tv1.setTypeface(roboto);
tv1.setText("Connect and start playing");
mSwipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
mSwipeLayout.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
活动的XML格式:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="100"
android:background="@color/darker"
android:orientation="vertical">
<FrameLayout
android:id="@+id/frameContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_weight="80"></FrameLayout>
<FrameLayout
android:id="@+id/mediaControllerFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentLeft="true"
android:layout_weight="20"></FrameLayout>
</LinearLayout>
<ListView
android:id="@+id/left_drawer"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="1dp" />
</android.support.v4.widget.DrawerLayout>
if (savedInstanceState == null) {
fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frameContainer, main, "main");
ft.setCustomAnimations(R.animator.fade_in, android.R.animator.fade_out);
ft.add(R.id.mediaControllerFrame, mdc);
ft.commit();
getFragmentManager().executePendingTransactions();
}
片段的XML
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical">
<TextView
android:id="@+id/pullToConnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="@string/pull_to_connect"
android:textColor="@android:color/white"
android:textSize="23dp" />
</LinearLayout>
<RelativeLayout
android:id="@+id/relative"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="24dp"
android:gravity="center_horizontal"
android:padding="15dp"
android:textColor="@android:color/white"
android:textSize="30dp" />
</RelativeLayout>
</LinearLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
您应该只在第一次调用onCreate()
时执行此片段初始化。FragmentManager
处理跨配置更改保留片段的操作,因此如果要旋转屏幕,onCreate()
将再次调用,并且每次都会在旧实例的基础上添加另一个main
和mdc
实例
相反,使用savedInstanceState
将片段初始化代码包装在空检查中。如果savedInstanceState
为空,则表示这是您的活动的第一次创建:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="100"
android:background="@color/darker"
android:orientation="vertical">
<FrameLayout
android:id="@+id/frameContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_weight="80"></FrameLayout>
<FrameLayout
android:id="@+id/mediaControllerFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentLeft="true"
android:layout_weight="20"></FrameLayout>
</LinearLayout>
<ListView
android:id="@+id/left_drawer"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="1dp" />
</android.support.v4.widget.DrawerLayout>
if (savedInstanceState == null) {
fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frameContainer, main, "main");
ft.setCustomAnimations(R.animator.fade_in, android.R.animator.fade_out);
ft.add(R.id.mediaControllerFrame, mdc);
ft.commit();
getFragmentManager().executePendingTransactions();
}
如果看不到代码(特别是xml和java,您实际上在其中初始化布局/视图),就无法判断。您是在添加片段还是用TextView替换片段?我只在create/resume方法上添加了一个片段就看到了这种情况,特别是在使用setRetainInstance(true)时。谢谢,我添加了代码。感谢您的帮助。是的,我正在使用片段管理器处理片段。如果您不介意,我还有一个问题-我是否应该始终创建一个包含片段的类的新实例?或者我可以分享这个实例。我的意思是,假设我初始化了fragment类一次,然后用户执行了onClick,然后我添加了一个不同的片段。现在让我们假设用户再次单击某个东西来加载以前的片段-我应该使用片段类的新实例还是可以重复使用旧实例的引用?老实说,我总是使用新实例。它通常不值得尝试保持它们的复杂性,而且它可能会导致一些微妙的错误。除非你的片段真的很昂贵,否则我会坚持做一个新的。