Android 如何让 getIntent().getExtras() 在片段中工作,'getIntent 未定义该类型'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22195082/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get getIntent().getExtras() to work in a fragment, 'getIntent is undefined for the type'
提问by user3092467
Hi i'm trying to change an activity to a fragment so i can add it to a swipe layout and i think i'm just about done (unless anyone can see any other errors in my code) but i cannot find a solution to my problem anywhere, it says that 'getIntent() is undefined for the type SoftwarePageFragment' I'm really new to this and have literally been coding in android to a week or so???
嗨,我正在尝试将活动更改为片段,以便我可以将其添加到滑动布局中,我想我快完成了(除非任何人都可以看到我的代码中的任何其他错误),但我找不到解决我的问题的方法任何地方的问题,它说'getIntent() 未定义为SoftwarePageFragment 类型'我真的很陌生,实际上已经在android 中编码了一个星期左右???
package com.learn2crack.tab;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
interface OnHeadlineSelectedListener {
/** Called by HeadlinesFragment when a list item is selected */
public void onArticleSelected(int position);
}
public class SoftwarePageFragment extends Fragment implements OnHeadlineSelectedListener {
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.rooms_view, container, false);
//@Override
//public void onStart() {
// super.onStart();
if (getView().findViewById(R.id.fragment_container) != null) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
return container;
}
// Create an instance of ExampleFragment
HeadlinesFragment firstFragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an Intent,
// pass the Intent's extras to the fragment as arguments
Bundle bundle = new Bundle();
bundle.putString("key", value);//you can use putInt or putBoolean etc
firstFragment.setArguments(bundle);
// Add the fragment to the 'fragment_container' FrameLayout
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Capture the article fragment from the activity layout
ArticleFragment articleFrag = (ArticleFragment)
getFragmentManager().findFragmentById(R.id.Software);
if (articleFrag != null) {
// If article frag is available, we're in two-pane layout...
// Call a method in the ArticleFragment to update its content
articleFrag.updateArticleView(position);
} else {
// If the frag is not available, we're in the one-pane layout and must swap frags...
// Create fragment and give it an argument for the selected article
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
}
public class ArticleFragment extends Fragment {
final static String ARG_POSITION = "position";
int mCurrentPosition = -1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// If activity recreated (such as from screen rotate), restore
// the previous article selection set by onSaveInstanceState().
// This is primarily necessary when in the two-pane layout.
if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.sofware_view, container, false);
}
@Override
public void onStart() {
super.onStart();
// During startup, check if there are arguments passed to the fragment.
// onStart is a good place to do this because the layout has already been
// applied to the fragment at this point so we can safely call the method
// below that sets the article text.
Bundle args = getArguments();
if (args != null) {
// Set article based on argument passed in
updateArticleView(args.getInt(ARG_POSITION));
} else if (mCurrentPosition != -1) {
// Set article based on saved instance state defined during onCreateView
updateArticleView(mCurrentPosition);
}
}
public void updateArticleView(int position) {
TextView article = (TextView) getActivity().findViewById(R.id.Software);
article.setText(Rooms[position]);
mCurrentPosition = position;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save the current article selection in case we need to recreate the fragment
outState.putInt(ARG_POSITION, mCurrentPosition);
}
}
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We need to use a different list item layout for devices older than Honeycomb
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;
// Create an array adapter for the list view, using the Ipsum headlines array
setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Software));
}
@Override
public void onStart() {
super.onStart();
// When in two-pane layout, set the listview to highlight the selected list item
// (We do this during onStart because at the point the listview is available.)
if (getFragmentManager().findFragmentById(R.id.Software) != null) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception.
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Notify the parent activity of selected item
mCallback.onArticleSelected(position);
// Set the item as checked to be highlighted when in two-pane layout
getListView().setItemChecked(position, true);
}
}
ArrayAdapter<String> adapter;
static String Software[] = {
"3D Studio Max 2014",
"Adobe Creative Suite 6",
"Agilent Agent",
"Android SDK",
"Audacity",
"C Map Tools",
"Cedar and Easy 68k",
"Context",
"CryEngine 3",
"Derive V5.0",
"Dreamweaver CS6",
"Eclipse",
"Face Modeller",
"Flash CS6",
"Image J",
"Linux",
"Matlab R2012A (Computing Toolbase)",
"Matlab R2012A (Maths)",
"Microsoft Project",
"Microsoft SQL Sever Lite",
"MinecraftEDU",
"MiniTab 16",
"MonoGame",
"NetBeans 7.3.1",
"Office 2013",
"Oracle Client",
"Photoshop CS6",
"Premiere CS6",
"Python 3.3.2",
"QT 5.1",
"R-Studio",
"Rational Architect",
"Steam",
"SWI Pro Log",
"Unreal UDK",
"Visio 2012",
"Visual Studio 2012",
"Win A&D 7 Desktop",
"Windows Mobile SDK",
"Weka ML",
"XNA Game Studio"};
static String Rooms []= { "MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
"MEA 27\n MEA 34\n",
};
}
回答by demir
Use getActivity() in Fragment like this:
在 Fragment 中使用 getActivity() 像这样:
Bundle args = getActivity().getIntent().getExtras();
String value= args.getString("key");
回答by PageNotFound
try
尝试
Bundle bundle = new Bundle();
bundle.putString("key", value);//you can use putInt or putBoolean etc
firstFragment.setArguments(bundle);
回答by Bhanu Sharma
send like this
像这样发送
Fragment createNewChildForDir(int index, String machineId, int lvl) {
Bundle args = this.getArguments();
if (args == null) {
args = new Bundle();
} else {
args = new Bundle(args);
}
args.putString("machineId", machineId);
args.putString("hash_key", getDir[index].did);
args.putInt("lvl", lvl);
args.putString("isretrived", "yes");
Fragment f = new ChildrenMakingActivity();
f.setArguments(args);
return f;
}
and recive like this
并像这样接受
machineId = args.getString("machineId");
hash_key = args.getString("hash_key");
isretrived = args.getString("isretrived");
lvl = args.getInt("lvl",0);
回答by Blackbelt
getIntent()
is a method of Activity
, so you can not use inside a Fragment
since a fragment do not usually deal with Intent
. You should use setArguments/getArguments pair to pass data from the Activity
to the Fragment
getIntent()
是一个方法Activity
,所以你不能在 a 里面使用,Fragment
因为一个片段通常不处理Intent
。您应该使用setArguments / getArguments对从传递数据Activity
给Fragment
回答by Harshit Rathi
You need to check with Bundle Extras
instead of getIntent()
like this :
你需要检查Bundle Extras
而不是getIntent()
这样:
Bundle args = getArguments();
String temp = args.getString("key");