【问题标题】:App crashes due to TextView in Android由于 Android 中的 TextView 导致应用程序崩溃
【发布时间】:2017-01-07 16:13:47
【问题描述】:

我的应用程序因TextView 而崩溃。只要设备不改变其方向,它就可以工作。如果我删除 TextView 并旋转设备,一切正常,但使用 TextView 就不行了。
我有 2 种用于纵向和布局的布局。
它们看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextureView
        android:id="@+id/texture"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:layout_width="220dp"
        android:layout_height="50dp"
        android:id="@+id/text_time"
        android:textSize="20dp"
        android:textColor="@color/red"
        android:layout_marginTop="14dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

还有一些代码:

public void onViewCreated(final View view, Bundle savedInstanceState) {
        mTextView = (TextView) view.findViewById(R.id.text_time);
        mTextView.setVisibility(View.INVISIBLE);
}

然后在另一种方法中设置文本:

mTextView.setVisibility(View.VISIBLE);
mTextView.setText("Text");

就是这样。那么你有什么建议为什么这不起作用?

我收到以下错误:

01-07 17:14:28.117 12890-12890/k.com.kamera E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: k.com.kamera, PID: 12890
                                                                   java.lang.IllegalStateException: Fragment BasicFragmentVideo{e87fd0c} not attached to Activity
                                                                       at android.app.Fragment.getResources(Fragment.java:805)
                                                                       at android.app.Fragment.getString(Fragment.java:840)
                                                                       at k.com.kamera.BasicFragmentVideo$5$1$1.run(BasicFragmentVideo.java:483)
                                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:168)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5845)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

【问题讨论】:

  • 在fragment类中使用setretaininstance来保留fragment实例
  • 你能提供任何工作代码吗?

标签: android textview android-orientation


【解决方案1】:

在片段中使用 setRetainInstance 为 true,这将在发生方向时保留片段实例,现在在 onCreate 内的 Acitivty 中检查您的片段实例并添加

【讨论】:

  • 好的,但如果我将其设置为 true,则文本视图将不再存在。你知道怎么解决吗?
【解决方案2】:

每次方向改变时,您都会创建一个新的 Fragment 实例。并且其中只有一个实际上附加到了 Activity。试试这个

 public class TestActivity extends Activity {

    TestFragment testFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);
        attachFragment(savedInstanceState);
    }

    private void attachFragment(Bundle savedInstanceState) {
        if (savedInstanceState == null){
           testFragment = new TestFragment();
           getFragmentManager().beginTransaction()
           .replace(R.id.camera_frame, testFragment,     "testFragment").commitAllowingStateLoss();
    } else {
      testFragment =  (TestFragment)getFragmentManager().findFragmentByTag("testFragment");
    }
}

在片段的onCreateView() 或onActivityCreated() 中调用setRetainInstance(true)

【讨论】:

  • 我这样添加Fragment:android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.camera_frame, fragInfo); transaction.commit();
  • 你在使用import android.app.fragment?
  • 是的。只要设备不旋转它就可以工作,所以我不知道如何解决这个问题
  • 在您打开片段的活动中尝试传递活动的savedInstanceState 并检查我的代码...它会工作
  • 也改变你的片段交易代码添加testFragment标签
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多