의도의 모든 추가 항목 나열
디버깅을 위해 Intent의 모든 추가(및 해당 값)를 나열하려고 합니다.이제, 열쇠를 얻는 것은 문제가 되지 않습니다.
Set<String> keys = intent.getExtras().keySet();
하지만 키의 값을 얻는 것은 저에게 하나입니다. 어떤 값은 문자열이고 어떤 값은 부울 값이기 때문입니다.루프(키를 통해 루프)에서 값을 가져오고 로그 파일에 값을 기록하려면 어떻게 해야 합니까?힌트를 주셔서 감사합니다!
문서화되지 않은(타사 제품) 의도에 대한 정보를 얻기 위해 사용한 내용은 다음과 같습니다.
Bundle bundle = intent.getExtras();
if (bundle != null) {
for (String key : bundle.keySet()) {
Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
}
}
다음 항목이 있는지 확인하십시오.bundle
루프 앞에 null입니다.
이것이 인텐트의 모든 추가 항목을 덤프하는 유틸리티 방법을 정의하는 방법입니다.
import java.util.Iterator;
import java.util.Set;
import android.os.Bundle;
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
Log.e(LOG_TAG,"Dumping Intent start");
while (it.hasNext()) {
String key = it.next();
Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.e(LOG_TAG,"Dumping Intent end");
}
}
코드 한 줄로 수행할 수 있습니다.
Log.d("intent URI", intent.toUri(0));
출력은 다음과 같습니다.
"#의도;action=계속.의도적인 행동MAIN;카테고리=가 표시됩니다.의도적인.런처;launchFlags=0x10a00000;component=com.mydomain.myapp/.활동 시작;sourceBounds=12%20870%20276%201167;l.profile=0;종료"
이 문자열(내가 굵은 글씨로 표시한 부분)의 끝에는 추가 항목 목록이 있습니다(이 예에서는 추가 항목 하나만 있음).
이는 ToUri 문서에 따른 것입니다. "URI에는 작업, 범주, 유형, 플래그, 패키지, 구성 요소 및 추가 기능을 설명하는 추가 조각과 함께 Intent의 데이터가 기본 URI로 포함됩니다."
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("Extras: \n\r");
setContentView(tv);
StringBuilder str = new StringBuilder();
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
str.append(key);
str.append(":");
str.append(bundle.get(key));
str.append("\n\r");
}
tv.setText(str.toString());
}
}
디버그 모드에서 평가하는 데 유용한 Kotlin 솔루션:
// list: List<Pair<String!, Any?>>?
val list = intent.extras?.keySet()?.map { it to (intent.extras?.get(it) ?: "null") }
Log.d("list", list.toString();
된 모든 됩니다.extras
번들의 get(String key) 메서드는 개체를 반환합니다.각 키에서 get(String)을 호출하고 객체에서 toString()을 사용하여 키 세트를 회전하여 출력하는 것이 가장 좋습니다.이것은 원시적인 경우에 가장 잘 작동하지만 toString()을 구현하지 않는 개체와 관련된 문제가 발생할 수 있습니다.
저는 의도된 내용을 로그에 출력하고 쉽게 읽을 수 있는 방법을 원했습니다. 그래서 제가 생각해낸 것은 이렇습니다.다음을 만들었습니다.LogUtil
수업을 듣고, 그리고 나서 수업을 들었습니다.dumpIntent()
메소드 @Pratik이 생성하고 약간 수정했습니다. 것은 모든것은다같음습니다과이같다습▁here니이음다과▁looks.
public class LogUtil {
private static final String TAG = "IntentDump";
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("IntentDump \n\r");
stringBuilder.append("-------------------------------------------------------------\n\r");
for (String key : keys) {
stringBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r");
}
stringBuilder.append("-------------------------------------------------------------\n\r");
Log.i(TAG, stringBuilder.toString());
}
}
}
이것이 누군가에게 도움이 되기를 바랍니다!
Bundle extras = getIntent().getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
Log.d("KEY", iterator.next());
}
사용할 수 있습니다.for (String key : keys) { Object o = get(key);
객를반려면하환호출체, 호출▁call▁to를 호출합니다.getClass().getName()
그 위에 유형을 가져오고 if name.equals("String")를 입력하여 값을 얻기 위해 실제로 호출해야 하는 메서드를 지정합니다.
Android 소스에서 거의 모든 작업이 번들의 데이터 파싱을 강제로 해제한다는 것을 알게 되었습니다.따라서 (나처럼) 디버깅 목적으로 자주 이 작업을 수행해야 하는 경우 다음과 같이 빠르게 입력할 수 있습니다.
Bundle extras = getIntent().getExtras();
extras.isEmpty(); // unparcel
System.out.println(extras);
코틀린에서 ","로 구분된 문자열로 가져오세요!
val extras = intent?.extras?.keySet()?.map { "$it: ${intent.extras?.get(it)}" }?.joinToString { it }
ruX 응답을 기반으로 합니다.
의도의 모든 추가 사항을 덤프하는 Pratik의 유틸리티 메소드의 코틀린 버전:
fun dumpIntent(intent: Intent) {
val bundle: Bundle = intent.extras ?: return
val keys = bundle.keySet()
val it = keys.iterator()
Log.d(TAG, "Dumping intent start")
while (it.hasNext()) {
val key = it.next()
Log.d(TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.d(TAG, "Dumping intent finish")
}
이것이 너무 장황하거나 너무 늦다면 미안하지만, 이것이 제가 그 일을 끝낼 수 있는 유일한 방법이었습니다.가장 복잡한 요인은 java에 기준 전달 함수가 없기 때문에 get---Extra 메서드는 기본값을 반환해야 하며 기본값이 우연히 반환되는지 아니면 결과가 호의적이지 않아서인지를 알려주기 위해 부울 값을 수정할 수 없다는 것입니다.이러한 목적을 위해, 메소드가 기본값을 반환하는 것보다 예외를 제기하도록 하는 것이 더 좋았을 것입니다.
Android Intent Documentation이라는 제 정보를 찾았습니다.
//substitute your own intent here
Intent intent = new Intent();
intent.putExtra("first", "hello");
intent.putExtra("second", 1);
intent.putExtra("third", true);
intent.putExtra("fourth", 1.01);
// convert the set to a string array
String[] anArray = {};
Set<String> extras1 = (Set<String>) intent.getExtras().keySet();
String[] extras = (String[]) extras1.toArray(anArray);
// an arraylist to hold all of the strings
// rather than putting strings in here, you could display them
ArrayList<String> endResult = new ArrayList<String>();
for (int i=0; i<extras.length; i++) {
//try using as a String
String aString = intent.getStringExtra(extras[i]);
// is a string, because the default return value for a non-string is null
if (aString != null) {
endResult.add(extras[i] + " : " + aString);
}
// not a string
else {
// try the next data type, int
int anInt = intent.getIntExtra(extras[i], 0);
// is the default value signifying that either it is not an int or that it happens to be 0
if (anInt == 0) {
// is an int value that happens to be 0, the same as the default value
if (intent.getIntExtra(extras[i], 1) != 1) {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
// not an int value
// try double (also works for float)
else {
double aDouble = intent.getDoubleExtra(extras[i], 0.0);
// is the same as the default value, but does not necessarily mean that it is not double
if (aDouble == 0.0) {
// just happens that it was 0.0 and is a double
if (intent.getDoubleExtra(extras[i], 1.0) != 1.0) {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
// keep looking...
else {
// lastly check for boolean
boolean aBool = intent.getBooleanExtra(extras[i], false);
// same as default, but not necessarily not a bool (still could be a bool)
if (aBool == false) {
// it is a bool!
if (intent.getBooleanExtra(extras[i], true) != true) {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
else {
//well, the road ends here unless you want to add some more data types
}
}
// it is a bool
else {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
}
}
// is a double
else {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
}
}
// is an int value
else {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
}
}
// to display at the end
for (int i=0; i<endResult.size(); i++) {
Toast.makeText(this, endResult.get(i), Toast.LENGTH_SHORT).show();
}
디버깅을 위해 원하는 것이 문자열(OP에 의해 암시되지만 명시적으로 명시되지는 않음)인 경우 다음을 사용합니다.toString
여분으로Bundle
:
intent.getExtras().toString()
다음과 같은 문자열을 반환합니다.
Bundle[{key1=value1, key2=value2, key3=value3}]
설명서:Bundle.toString()(불행히도 기본값입니다.Object.toString()
자바독 그리고 여기서는 꽤 쓸모가 없습니다.)
언급URL : https://stackoverflow.com/questions/5968896/listing-all-extras-of-an-intent
'programing' 카테고리의 다른 글
jQuery에서 요소의 n번째 수준 상위 항목을 가져오려면 어떻게 해야 합니까? (0) | 2023.07.24 |
---|---|
cmath 단위의 sqrt, sin, cos, pow 등의 정의 (0) | 2023.07.24 |
@Controller 클래스의 Spring @Value 주석이 속성 파일 내부의 값으로 평가되지 않음 (0) | 2023.07.24 |
테이블의 ID에서 다른 테이블의 ID로 MariaDB 합계 크기 (0) | 2023.07.24 |
matplotlib에서 빈 하위 플롯을 만들려면 어떻게 해야 합니까? (0) | 2023.07.24 |