Android에서 사용자 지정 텍스트 선택 작업 제공

11735 단어 androidkotlin
최근에 앱Text Infinity을 발견했습니다. Android에서 선택한 텍스트에 대한 추가 작업을 제공합니다. 그래서 추가 작업을 제공하는 앱을 어떻게 만들 수 있는지 자문했습니다.
(출처: Google Play )

목차


  • How it works

  • Further cases
  • Multiple actions
  • Starting a service
  • Listening to certain types of text
  • Watch out: launchMode singleTop

  • References

  • 작동 방식



    Android 6.0부터 텍스트를 선택하면 플로팅 텍스트 선택 도구 모음이 나타납니다. 기본적으로 잘라내기, 복사 및 붙여넣기와 같은 일반적인 작업이 표시됩니다. 가장 좋은 점은 모든 앱이 텍스트 선택 도구 모음에 대한 사용자 지정 작업을 제공할 수 있다는 것입니다.

    기본적으로 활동은 암시적 의도를 수신해야 합니다ACTION_PROCESS_TEXT. 이를 위해 아래와 같이 매니페스트의 활동 내부에 intent filter을 추가해야 합니다.

    <activity
        android:name=".UppercaseActivity"
        android:label="@string/action_uppercase"
        >
        <intent-filter>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
    
    EXTRA_PROCESS_TEXT 매개변수에는 강조표시된 텍스트가 포함되어 있습니다.

    val text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT)
    

    매개변수가 하나 더 있습니다EXTRA_PROCESS_TEXT_READONLY. EditText 와 같은 편집 가능한 필드에서 작업이 트리거되었는지 확인하는 데 사용할 수 있습니다. 따라서 읽기 전용이 아닌 경우 수정된 버전의 텍스트를 반환할 수 있습니다.

    val readonly = intent.getBooleanExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false)
    

    일반적으로 전체 코드를 볼 때 내 마음은 개념을 더 잘 이해합니다. 따라서 다음은 잠재적인 구현 방법입니다.

    class UppercaseActivity : Activity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            val text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT)
            val readonly = intent.getBooleanExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false)
    
            if(!readonly && text != null){
    
                val outgoingIntent = Intent()
                outgoingIntent.putExtra(Intent.EXTRA_PROCESS_TEXT, text.toString().toUpperCase())
                setResult(Activity.RESULT_OK, outgoingIntent)
    
            } else {
                Toast.makeText(this, "Text cannot be modified", Toast.LENGTH_SHORT).show()
            }
    
            finish()
        }
    }
    

    이제 우리의 예를 살펴봅시다:

    추가 사례


    여러 작업



    단일 앱으로 여러 작업을 배포하려는 경우 각 텍스트 선택 작업에는 별도의 활동이 필요합니다.

    <activity
        android:name=".UppercaseActivity"
        android:label="@string/action_uppercase"
        >
        <intent-filter>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
    <activity
        android:name=".LowercaseActivity"
        android:label="@string/action_lowercase"
        >
        <intent-filter>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ReverseActivity"
        android:label="@string/action_reverse"
        >
        <intent-filter>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>
    

    서비스 시작



    인텐트ACTION_PROCESS_TEXT의 경우 Android 시스템은 활동만 찾습니다. 즉, 이 의도로 서비스를 직접 시작할 수 없습니다. 그러나 귀하의 활동은 나중에 단순히 서비스를 시작할 수 있습니다.

    특정 유형의 텍스트 듣기



    전화번호, 링크 등과 같은 특정 유형의 텍스트에 대해서만 작업이 트리거될 수 있는지 궁금할 수 있습니다. 불행히도 Android 시스템 내에서는 이를 수행할 방법이 없습니다. 즉, 당신의 행동은 항상 나타날 것입니다. 따라서 처리하기 전에 사용자 입력의 유효성을 검사해야 합니다.

    조심하세요: launchMode singleTop



    활동이 launchMode=”singleTop” 로 구성된 경우 onNewIntent() 메서드 내에서 텍스트 선택 작업도 처리해야 합니다. (launchMode에 대한 자세한 내용은 Tasks을 참조하십시오.)

    참조



  • Creating custom Text Selection actions with ACTION_PROCESS_TEXT by Ian Lake

  • Understand Tasks and Back Stack 안드로이드용

  • Intents and Intent Filters 안드로이드용
  • Estée Janssens에서 Unsplash의 표지 이미지
  • 좋은 웹페이지 즐겨찾기