【问题标题】:send data from my activy class, to fragment class (tabs)从我的活动类发送数据到片段类(选项卡)
【发布时间】:2014-04-21 19:16:42
【问题描述】:

我有一个带有列表视图的活动类。如果我单击列表视图的一个项目,我想转到我的 fragmentactivity 类并以捆绑的形式传递一些信息。

这是我的 Activity 类 (ProviderList) 中带有列表视图的代码。 EditSms 是一个片段类(一个选项卡)。 EditBundle 是创建选项卡的 fragmentActivity 类。

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

     EditSms fragment = new EditSms();
     Bundle args = new Bundle();
     args.putInt("position", position);
     fragment.setArguments(args);
     Intent i = new Intent(ProviderList.this, EditBundle.class);

    startActivity(i);

}

在我的片段类 EditText 中,我有以下代码:

public class EditSms extends Fragment implements OnClickListener {
private Button bChangeSMS;
private EditText etSmsEN;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View editsms = inflater.inflate(R.layout.sms_frag, container, false);
     int position = getArguments().getInt("position");
     Log.d("test", "position: " + position);
    bChangeSMS = (Button)editsms.findViewById(R.id.bAdjustSMS);
    etSmsEN = (EditText)editsms.findViewById(R.id.etSmsEN);
    bChangeSMS.setOnClickListener(this);

    return editsms;
}

编辑包:

    package com.example.mobieleplatformen;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.util.Log;

public class EditBundle extends FragmentActivity {

    ViewPager Tab;
    TabPagerAdapter TabAdapter;
    ActionBar actionBar;

    @Override
    protected void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub

        super.onCreate(arg0);
        setContentView(R.layout.editbundle);
        int position = getIntent().getExtras().getInt("position");
        Log.d("test", position + "");

        Bundle in = getIntent().getExtras();
        EditSms fragment = new EditSms();
        fragment.setArguments(in);
        FragmentManager fm = getFragmentManager();
        fm.beginTransaction().replace(R.id.pager, fragment).commit();

        TabAdapter = new TabPagerAdapter(getSupportFragmentManager());
        Tab = (ViewPager) findViewById(R.id.pager);
        Tab.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                actionBar = getActionBar();
                actionBar.setSelectedNavigationItem(position);
            }
        });
        Tab.setAdapter(TabAdapter);
        actionBar = getActionBar();
        // Enable Tabs on Action Bar
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.TabListener tabListener = new ActionBar.TabListener() {
            @Override
            public void onTabReselected(android.app.ActionBar.Tab tab,
                    FragmentTransaction ft) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
                Tab.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(android.app.ActionBar.Tab tab,
                    FragmentTransaction ft) {
                // TODO Auto-generated method stub
            }
        };
        // Add New Tab
        actionBar.addTab(actionBar.newTab().setText("Call")
                .setTabListener(tabListener));
        actionBar.addTab(actionBar.newTab().setText("SMS")
                .setTabListener(tabListener));
        actionBar.addTab(actionBar.newTab().setText("Data")
                .setTabListener(tabListener));
    }
}

编辑短信:

package com.example.mobieleplatformen;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class EditSms extends Fragment implements
        OnClickListener {
    private Button bChangeSMS;
    private EditText etSmsEN;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View editsms = inflater.inflate(R.layout.sms_frag, container, false);

    int position = getArguments().getInt("position", 0);
    Log.d("test", "position: ");
    bChangeSMS = (Button) editsms.findViewById(R.id.bAdjustSMS);
    etSmsEN = (EditText) editsms.findViewById(R.id.etSmsEN);
    bChangeSMS.setOnClickListener(this);

    return editsms;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}

Logcat:

Logcat: 04-21 19:49:51.541:E/AndroidRuntime(1042):致命异常:主要 04-21 19:49:51.541: E/AndroidRuntime(1042): java.lang.NullPointerException 04-21 19:49:51.541: E/AndroidRuntime(1042): at com.example.mobieleplatformen.EditSms.onCreateView(EditSms.java:25) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.view.ViewPager.populate(ViewPager.java:914) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.View.measure(View.java:15848) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.View.measure(View.java:15848) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.View.measure(View.java:15848) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.View.measure(View.java:15848) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.Choreographer.doCallbacks(Choreographer.java:562) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.Choreographer.doFrame(Choreographer.java:532) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.os.Handler.handleCallback(Handler.java:730) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.os.Handler.dispatchMessage(Handler.java:92) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.os.Looper.loop(Looper.java:137) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 android.app.ActivityThread.main(ActivityThread.java:5103) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 java.lang.reflect.Method.invoke(Method.java:525) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 04-21 19:49:51.541: E/AndroidRuntime(1042): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 04-21 19:49:51.541: E/AndroidRuntime(1042): at dalvik.system.NativeStart.main(Native Method)

当我运行这段代码时,我得到一个空指针异常。谁知道我做错了什么?

【问题讨论】:

  • 你从哪里得到 NPE?
  • getArguments() 返回 null
  • 尝试改变 fragment.setArguments(args);到 fragment.putExtras(args);和 getArguments().getInt("position");到 getIntent().getExtras().getInt("position");
  • 我没看对,对不起。让我看看我是不是想不通
  • 哦,是的,我明白了。您需要将捆绑包传递给您的 FragmentActivity (EditBundle),您可以在其中使用 getIntent().getExtras().... 得到它,就像我上面想的那样。然后,您需要在 EditBundle 中为您的片段设置参数,并像您一样在片段中获取它们。

标签: android eclipse


【解决方案1】:

我对此不确定,可能需要在我更改后编辑一些内容以尝试它们,但我认为您需要做这样的事情。

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    Bundle args = new Bundle();
    args.putInt("position", position);

    Intent i = new Intent(ProviderList.this, EditBundle.class);
    i.putExtras(args);
    startActivity(i);

}

然后在你的 EditBundle 的 onCreate 中

Bundle in = getIntent().getExtras();
EditSms fragment = new EditSms();
fragment.setArguments(in);
FragmentManager fm = getSupportFragmentManager();

然后,如果您还没有添加片段

fm.beginTransaction().replace(R.id.container, fragment).commit();

如果没有

fm.beginTransaction().add(R.id.container, fragment).commit();

而在EditSms中,它必须从你的支持库中扩展Fragment(导入android.support.v4.app.Fragment;),因为你的FragmentActivity来自支持库,你可以在你的Activity创建后访问

public void onActivityCreated(Bundle savedInstanceState){
    getArguments().getInt("positon", 0);
    //do whatever
}

这样你通过你的意图传递你的包,你在通过你的意图启动的活动中获取它,然后你从它包含的活动中设置你的片段的参数。

【讨论】:

  • 感谢您的努力,但仍然无法正常工作。在 EditBundle 中,我正确接收了位置,但如果我想将它传递给 EditSms,我仍然会得到 de nullpointer...
  • @user3557718 检查我的编辑。我认为问题在于,一旦设置了参数,您就永远不会真正将片段添加到堆栈中,因此参数仍设置为默认值。
  • 我收到替换错误:“将'片段'的类型更改为片段”。那我是不是做错了什么?
  • 不,我正在犯愚蠢的错误,因为我试图在我的牢房中这样做。给我一分钟
  • @user3557718 检查我编辑的答案并试一试。
【解决方案2】:

我已经研究了一个解决方案,我想我找到了一个。也许它不是最好的,但我认为它现在很好。

活动类:

Bundle basket = new Bundle();
        basket.putInt("position", position);

         Intent i = new Intent(ProviderList.this, EditBundle.class);
        i.putExtras(basket);
        startActivity(i);

编辑包

Bundle gotBasket = getIntent().getExtras();

        position = gotBasket.getInt("position");

我还为位置做了一个吸气剂。

public int getPosition(){
        return position;
    }

在我的 Fragment 类 EditSms 中,我调用 getter 并获取位置

EditBundle b = (EditBundle)getActivity();
        Log.d("pos", b.getPosition() + "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多