Android 片段参数包:当键存在时 getString 返回 null
Android Fragment argument bundle: getString returning null when key exists
我很确定我在这里遗漏了一些简单的东西。提前致歉,我是 Android.
的新手
到目前为止,我的应用程序向 Strava OAuth 服务器发送了一个请求,该请求通过我在请求中使用的回调 URI returns 发送到我的应用程序的隐式深度 link。我正在尝试获取与传递给片段的回调 URI 一起传递的 'code' 和 'scope' 参数。收到的参数是这个,通过 getArguments 找到。
Bundle[{android-support-nav:controller:deepLinkIntent=Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=myapp://localhost/fibonacci/itemFragment?state=&code=d37efb9e5b66325ddd34614c41550dd1c00d8444&scope=read,activity:read_all,read_all flg=0x1440c000 cmp=com.example.fibonacci/.MainActivity (has extras) }}]
当我在调试时检查 bundle 变量时,我还看到了一个包含以下内容的层次结构:
bundle -> mMap -> value[0] -> mData -> uriString
uriString 是从 Fragment 的参数派生的整个包的子集:
myapp://localhost/fibonacci/itemFragment?state=&code=d37efb9e5b66325ddd34614c41550dd1c00d8444&scope=read,activity:read_all,read_all
我一直在试验的代码如下(请参阅 onCreate() )。我显然正在以一种过于幼稚的方式做某事,因为它为我试图从参数包中取出的东西返回 null。如果我忽略了 Android 文档中的某个页面,我将不胜感激 link 或建议。
谢谢!
package com.example.fibonacci;
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.fibonacci.dummy.DummyContent;
/**
* A fragment representing a list of Items.
*/
public class ItemFragment extends Fragment {
// TODO: Customize parameter argument names
private static final String ARG_COLUMN_COUNT = "column-count";
private static final String ARG_STRAVA_CODE = "code";
private static final String ARG_STRAVA_SCOPE = "scope";
private static final String ARG_STRAVA_URISTRING = "uriString";
// TODO: Customize parameters
private int mColumnCount = 1;
private String mCode = null;
private String mScope = null;
private String mUriString = null;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public ItemFragment() {
}
// TODO: Customize parameter initialization
@SuppressWarnings("unused")
public static ItemFragment newInstance(int columnCount) {
ItemFragment fragment = new ItemFragment();
Bundle args = new Bundle();
args.putInt(ARG_COLUMN_COUNT, columnCount);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get arguments
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
Bundle bundle = getArguments();
mUriString = bundle.getString(ARG_STRAVA_URISTRING);
mCode = bundle.getString(ARG_STRAVA_CODE);
mScope = bundle.getString(ARG_STRAVA_SCOPE);
}
// GET the refresh and short-lived access token
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_item_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
if (mColumnCount <= 1) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
}
recyclerView.setAdapter(new MyItemRecyclerViewAdapter(DummyContent.ITEMS));
}
return view;
}
}
编辑:我也不明白为什么 'column-count' 参数没有出现在包中。那个是由我选择的片段模板自动创建的,但我希望它在整个包中。
我缺少的是 Bundle 中有一个完整的 Intent 对象。我必须使用以下代码从片段的 Activity 中查询 Intent:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get arguments
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
Bundle bundle = getArguments();
Intent intent = getActivity().getIntent();
Uri data = intent.getData();
mCode = data.getQueryParameter(ARG_STRAVA_CODE);
mScope = data.getQueryParameter(ARG_STRAVA_SCOPE);
}
// GET the refresh and short-lived access token
}
我很确定我在这里遗漏了一些简单的东西。提前致歉,我是 Android.
的新手到目前为止,我的应用程序向 Strava OAuth 服务器发送了一个请求,该请求通过我在请求中使用的回调 URI returns 发送到我的应用程序的隐式深度 link。我正在尝试获取与传递给片段的回调 URI 一起传递的 'code' 和 'scope' 参数。收到的参数是这个,通过 getArguments 找到。
Bundle[{android-support-nav:controller:deepLinkIntent=Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=myapp://localhost/fibonacci/itemFragment?state=&code=d37efb9e5b66325ddd34614c41550dd1c00d8444&scope=read,activity:read_all,read_all flg=0x1440c000 cmp=com.example.fibonacci/.MainActivity (has extras) }}]
当我在调试时检查 bundle 变量时,我还看到了一个包含以下内容的层次结构:
bundle -> mMap -> value[0] -> mData -> uriString
uriString 是从 Fragment 的参数派生的整个包的子集:
myapp://localhost/fibonacci/itemFragment?state=&code=d37efb9e5b66325ddd34614c41550dd1c00d8444&scope=read,activity:read_all,read_all
我一直在试验的代码如下(请参阅 onCreate() )。我显然正在以一种过于幼稚的方式做某事,因为它为我试图从参数包中取出的东西返回 null。如果我忽略了 Android 文档中的某个页面,我将不胜感激 link 或建议。
谢谢!
package com.example.fibonacci;
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.fibonacci.dummy.DummyContent;
/**
* A fragment representing a list of Items.
*/
public class ItemFragment extends Fragment {
// TODO: Customize parameter argument names
private static final String ARG_COLUMN_COUNT = "column-count";
private static final String ARG_STRAVA_CODE = "code";
private static final String ARG_STRAVA_SCOPE = "scope";
private static final String ARG_STRAVA_URISTRING = "uriString";
// TODO: Customize parameters
private int mColumnCount = 1;
private String mCode = null;
private String mScope = null;
private String mUriString = null;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public ItemFragment() {
}
// TODO: Customize parameter initialization
@SuppressWarnings("unused")
public static ItemFragment newInstance(int columnCount) {
ItemFragment fragment = new ItemFragment();
Bundle args = new Bundle();
args.putInt(ARG_COLUMN_COUNT, columnCount);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get arguments
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
Bundle bundle = getArguments();
mUriString = bundle.getString(ARG_STRAVA_URISTRING);
mCode = bundle.getString(ARG_STRAVA_CODE);
mScope = bundle.getString(ARG_STRAVA_SCOPE);
}
// GET the refresh and short-lived access token
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_item_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
if (mColumnCount <= 1) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
}
recyclerView.setAdapter(new MyItemRecyclerViewAdapter(DummyContent.ITEMS));
}
return view;
}
}
编辑:我也不明白为什么 'column-count' 参数没有出现在包中。那个是由我选择的片段模板自动创建的,但我希望它在整个包中。
我缺少的是 Bundle 中有一个完整的 Intent 对象。我必须使用以下代码从片段的 Activity 中查询 Intent:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get arguments
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
Bundle bundle = getArguments();
Intent intent = getActivity().getIntent();
Uri data = intent.getData();
mCode = data.getQueryParameter(ARG_STRAVA_CODE);
mScope = data.getQueryParameter(ARG_STRAVA_SCOPE);
}
// GET the refresh and short-lived access token
}