【问题标题】:How to get getIntent().getExtras() to work in a fragment, 'getIntent is undefined for the type'如何让 getIntent().getExtras() 在片段中工作,'getIntent 未定义类型'
【发布时间】:2014-03-05 10:30:06
【问题描述】:

您好,我正在尝试将活动更改为片段,以便将其添加到滑动布局中,我想我即将完成(除非任何人都可以在我的代码中看到任何其他错误)但我找不到在任何地方解决我的问题,它说'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",




    };



}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    像这样在 Fragment 中使用 getActivity():

    Bundle args = getActivity().getIntent().getExtras();
    String value= args.getString("key");
    

    【讨论】:

    • 这似乎适用于该位,但现在有一个问题 if (savedInstanceState != null) { return container;它说'savedInstanceState 不能解析为变量'和容器的相同错误
    • 试试这个:@Override public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); outState.putString("key", value); }
    【解决方案2】:

    试试

    Bundle bundle = new Bundle();
    bundle.putString("key", value);//you can use putInt or putBoolean etc
    firstFragment.setArguments(bundle);
    

    【讨论】:

    • 那没用,只是给了我到处都是红线
    • 我收到一个错误,键说“无效字符常量”
    • 你可以把'key'改成"key"
    • 现在显示“值无法解析为变量”
    【解决方案3】:

    getIntent() 是Activity 的一个方法,所以你不能在Fragment 内部使用,因为片段通常不处理Intent。您应该使用 setArguments/getArguments 对将数据从 Activity 传递到 Fragment

    【讨论】:

    • 你会怎么做?
    【解决方案4】:

    这样发送

    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;
    } 
    

    然后像这样接受

    machineId = args.getString("machineId");
                hash_key = args.getString("hash_key");
                isretrived = args.getString("isretrived");
    
                lvl = args.getInt("lvl",0);
    

    【讨论】:

    • 我想发送 int index, String machineId, int lvl 你可以传递任何你想要的然后像往常一样替换片段
    【解决方案5】:

    您需要像这样检查Bundle Extras 而不是getIntent():

    Bundle args = getArguments();
    String temp = args.getString("key");
    

    【讨论】:

    • 这在整个 if 语句中给了我红线。我会把那个放在哪里?
    • 所有的 if 语句,我不能在这里写它太长了,但我摆脱了 firstFragment.setArguments(getIntent().getExtras());并提出您的建议
    • 不,那不是问题
    • 捆绑捆绑 = 新捆绑(); bundle.putString("key", value);//可以使用putInt或putBoolean等firstFragment.setArguments(bundle);
    • 检查您的值数据类型并根据该类型将值放入捆绑包中。
    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多