【问题标题】:Android: how to change text to hyperlink in "fragment"Android:如何将文本更改为“片段”中的超链接
【发布时间】:2018-09-25 22:04:51
【问题描述】:

我正在尝试将我的文本更改为片段中的超链接。可悲的是,大多数网站只在“活动”中展示文本超链接转换,而不在“片段”中展示。

到目前为止,当我尝试运行它时,它一直显示“应用已停止”。

  1. 我已关闭我的即时运行以避免可能的错误( Session 'app': Error Launching activity), 但徒劳无功。而且我不明白那个网站提供的第二种方法(删除.gradle和.idea文件夹),我不知道这两个文件夹在哪里,我害怕删除错误的文件夹并丢失我的程序......
  2. 有人说是appcompat-v7的问题,但我不知道怎么解决,我尝试导入android.app.Activity并丢弃appcompat-v7,但是导致了一个更复杂的问题。(因为所有我里面的代码是用appcompat-v7形式写的)findViewById() may produce NullPointerException
  3. 我的超链接代码基于这两个站点。Creating a hyperlink within a textview inside a fragmentAdding a Hyperlinked text in the array.xml 非常感谢你帮助我,这对我来说意义重大>

日志猫:

04-16 15:21:22.076 6091-6091/? I/art: Not late-enabling -Xcheck:jni (already on)
04-16 15:21:22.076 6091-6091/? W/art: Unexpected CPU variant for X86 using defaults: x86
04-16 15:21:22.149 6091-6091/com.example.ellen.spinnercontent W/System: ClassLoader referenced unknown path: /data/app/com.example.ellen.spinnercontent-3/lib/x86
04-16 15:21:22.281 6091-6091/com.example.ellen.spinnercontent W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-16 15:21:22.691 6091-6106/com.example.ellen.spinnercontent I/OpenGLRenderer: Initialized EGL, version 1.4
04-16 15:21:22.692 6091-6106/com.example.ellen.spinnercontent D/OpenGLRenderer: Swap behavior 1
04-16 15:21:22.692 6091-6106/com.example.ellen.spinnercontent W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-16 15:21:22.692 6091-6106/com.example.ellen.spinnercontent D/OpenGLRenderer: Swap behavior 0
04-16 15:21:22.705 6091-6106/com.example.ellen.spinnercontent D/EGL_emulation: eglCreateContext: 0xa8e851e0: maj 2 min 0 rcv 2
04-16 15:21:22.710 6091-6106/com.example.ellen.spinnercontent D/EGL_emulation: eglMakeCurrent: 0xa8e851e0: ver 2 0 (tinfo 0xa8e837e0)
04-16 15:21:22.790 6091-6106/com.example.ellen.spinnercontent D/EGL_emulation: eglMakeCurrent: 0xa8e851e0: ver 2 0 (tinfo 0xa8e837e0)
04-16 15:21:22.886 6091-6091/com.example.ellen.spinnercontent D/AndroidRuntime: Shutting down VM
04-16 15:21:22.887 6091-6091/com.example.ellen.spinnercontent E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example.ellen.spinnercontent, PID: 6091
                                                                                java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                    at com.example.ellen.spinnercontent.FragmentOne.onCreateView(FragmentOne.java:34)
                                                                                    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
                                                                                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                                                                                    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                                                                                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                                                                                    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
                                                                                    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
                                                                                    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
                                                                                    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
                                                                                    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
                                                                                    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
                                                                                    at android.os.Handler.handleCallback(Handler.java:751)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                    at android.os.Looper.loop(Looper.java:154)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

运行:

 04/16 14:52:00: Launching app
$ adb push /Users/ellen/Desktop/my-spinner/spinnerContent/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.example.ellen.spinnercontent
$ adb shell pm install -t -r "/data/local/tmp/com.example.ellen.spinnercontent"
Success


$ adb shell am start -n "com.example.ellen.spinnercontent/com.example.ellen.spinnercontent.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet.Waiting for process to come online
Connected to process 2682 on device emulator-5554
Capturing and displaying logcat messages from the application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/System: ClassLoader referenced unknown path: /data/app/com.example.ellen.spinnercontent-3/lib/x86
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 1
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/OpenGLRenderer: Swap behavior 0
D/EGL_emulation: eglCreateContext: 0xa8e851e0: maj 2 min 0 rcv 2
D/EGL_emulation: eglMakeCurrent: 0xa8e851e0: ver 2 0 (tinfo 0xa8e83820)
D/EGL_emulation: eglMakeCurrent: 0xa8e851e0: ver 2 0 (tinfo 0xa8e83820)
D/AndroidRuntime: Shutting down VM


                  --------- beginning of the crash
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.ellen.spinnercontent, PID: 2682
                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                      at com.example.ellen.spinnercontent.FragmentOne.onCreateView(FragmentOne.java:34)
                      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                      at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
                      at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
                      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
                      at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
                      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.

fragment_fragment_one.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light"
    tools:context="com.example.ellen.spinnercontent.FragmentOne">

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/forone"
        android:id="@+id/textView1"
        android:clickable="true"
        android:focusable="true"
        android:layout_gravity="center"/>

</FrameLayout>

FragmentOne.java:

public class FragmentOne extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


       //add this and app keeps stopping 
        TextView tf1 = (TextView) getView().findViewById(R.id.textView1);
        if (tf1 != null) {
            tf1.setMovementMethod(LinkMovementMethod.getInstance());
            String text = "<a href='http://www.youtube.com/watch?v=Fd_AtH0yVqU'> here is the video</a>";
            tf1.setText(Html.fromHtml(text));
        }


        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_fragment_one, container, false);


    }
}

strings.xml:

<resources>
 <string name="forone">
    <a href="https://www.youtube.com/watch?v=Fd_AtH0yVqU">here is the video </a>
    </string>
</resources>

build.gradle(项目)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(模块)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.ellen.spinnercontent"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ellen.spinnercontent">

    <uses-permission android:name="android.permission.INTENT"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我希望这对你有用。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_fragment_one, container, false);
    TextView tf1 = (TextView) view.findViewById(R.id.textView1);
    
    if (tf1 != null) {
            tf1.setMovementMethod(LinkMovementMethod.getInstance());
            String text = "<a href='http://www.youtube.com/watch?v=Fd_AtH0yVqU'>here is the video</a>";
            tf1.setText(Html.fromHtml(text));
        }
    
        return view;
    }
    

    【讨论】:

      【解决方案2】:

      您需要为使用 getView 的 FragmentOne 扩展布局,该布局返回空视图对象,因为没有附加视图。

      用这个更新你的代码

      View v = inflater.inflate(R.layout.<your_layout>, container, false);
      

      现在使用 v 对象来查找布局视图。例如,从布局中查找 textview 使用代码作为

      TextView tv = (TextView) v.findViewById(R.id.tv);
      

      并从片段的onCreateView方法中返回v替换默认返回。

      现在将文本转换为超链接,然后在 xml 中添加此代码

          android:autoLink="email"
      

      也根据您的要求向其他人“发送电子邮件”。

      【讨论】:

        【解决方案3】:

        自从

        return inflater.inflate(R.layout.fragment_fragment_one, container, false);
        

        创建片段所需的视图,因此在您调用 getView().findViewById(R.id.textView1) 的那一刻,实际上没有可找到的视图。

        相反,您应该在onViewCreated() 中进行设置。在您的片段中创建新功能,例如:

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            TextView tf1 = (TextView) view.findViewById(R.id.textView1);
            if (tf1 != null) {
                tf1.setMovementMethod(LinkMovementMethod.getInstance());
                String text = "<a href='http://www.youtube.com/watch?v=Fd_AtH0yVqU'> here is the video</a>";
                tf1.setText(Html.fromHtml(text));
            }
        }
        

        另请阅读:Creating and Using Fragments

        【讨论】:

        • 感谢您的准确解释和网站链接!!!它对像我这样的新手很有帮助>
        【解决方案4】:
                @Override
                    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                             Bundle savedInstanceState) {
        
                 View rootView = inflater.inflate(R.layout.fragment_fragment_one, container, false);
                 TextView tf1 = (TextView) rootview.findViewById(R.id.textView1);
        
                return rootview;
        
        }
        

        【讨论】:

          【解决方案5】:

          你有一个 NullPointerException 因为你太晚膨胀布局。首先在您的 onCreateView 中执行此操作

          View rootView = inflater.inflate(R.layout.fragment_fragment_one, container, false);

          澄清:

          这一行

          TextView tf1 = (TextView) getView().findViewById(R.id.textView1);

          搜索 TextView,但您尚未定义从哪个布局开始,因此它不知道在哪里查找。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-12
            • 2017-07-01
            • 1970-01-01
            • 2020-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多