java - 选项卡式导航,将 Intent 附加信息传递给 fragment

标签 java android android-intent android-fragments

快速提问。

我正在开发一个有 2 个 Activity 的应用程序。

Activity A 使用带有 3 个选项卡的选项卡导航。每个标签都有一个 fragment ,有几个以宿舍命名的按钮。每个按钮作为宿舍名称的 ID,因此,单击宿舍 A 将启动 Activity B , 并使用 case 语句并找到按钮的 ID 将使用 EXTRA 字符串(宿舍名称)启动 Activity B。

Activity B 也使用标签导航,有 3 个标签。一个列出人员,一个列出事件,一个列出 RA 的办公时间。

我的问题是启动 Activity 并将 Extra 添加到 Activity 中,这将根据 Extra 字符串从数据库中添加信息(即单击 Dorm A 将执行 SQL SELECT WHERE Dorm = 'EXTRA' 或其他内容)。我在这里尝试使用教程:http://wptrafficanalyzer.in/blog/itemclick-handler-for-listfragment-in-android/但我的应用程序一直在崩溃。我在这里和那里使用了其他一些教程,试图了解 Fragments 是如何工作的,我对 Android 还不是很熟悉。无需尝试通过 EXTRA,我可以运行 APP 并显示一些带有填充文本或按钮或其他内容的非常简单的 View 。

我尝试使用这里的一些代码:Where/How to getIntent().getExtras() in an Android Fragment?但我不太明白它是如何工作的,当我使用它时,我得到了相同的结果:崩溃。

这是 LogCat,当我尝试获取 String Intent 时,我可以看到 NullPointerException 引发了错误:
05-15 20:31:51.278: E/AndroidRuntime(2274): FATAL EXCEPTION: main 05-15 20:31:51.278: E/AndroidRuntime(2274): Process: ege493.test.hawksnesttabs, PID: 2274 05-15 20:31:51.278: E/AndroidRuntime(2274): java.lang.RuntimeException: Unable to start activity ComponentInfo{ege493.test.hawksnesttabs/ege493.test.hawksnesttabs.DormInfo}: java.lang.NullPointerException 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread.access$800(ActivityThread.java:135) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.os.Handler.dispatchMessage(Handler.java:102) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.os.Looper.loop(Looper.java:136) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread.main(ActivityThread.java:5017) 05-15 20:31:51.278: E/AndroidRuntime(2274): at java.lang.reflect.Method.invokeNative(Native Method) 05-15 20:31:51.278: E/AndroidRuntime(2274): at java.lang.reflect.Method.invoke(Method.java:515) 05-15 20:31:51.278: E/AndroidRuntime(2274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 05-15 20:31:51.278: E/AndroidRuntime(2274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 05-15 20:31:51.278: E/AndroidRuntime(2274): at dalvik.system.NativeStart.main(Native Method) 05-15 20:31:51.278: E/AndroidRuntime(2274): Caused by: java.lang.NullPointerException 05-15 20:31:51.278: E/AndroidRuntime(2274): at ege493.test.hawksnesttabs.Fragment_RA.onCreateView(Fragment_RA.java:33) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.Fragment.performCreateView(Fragment.java:1700) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.BackStackRecord.run(BackStackRecord.java:684) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.Activity.performStart(Activity.java:5240) 05-15 20:31:51.278: E/AndroidRuntime(2274): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) 05-15 20:31:51.278: E/AndroidRuntime(2274): ... 11 more
Activity A:(一些评论是我稍后会尝试修复的其他一些其他问题)

package ege493.test.hawksnesttabs;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
    public final static String EXTRA_DORM = "ege493.Dorm";

    ActionBar actionBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        actionBar = getActionBar(); // Get reference to ActionBar

        // 1. Enable ActionBar navigation tabs
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);

        // 2. Add the tabs
        Tab hasbrouckTab = actionBar.newTab();
        Tab parkerTab = actionBar.newTab();
        Tab southTab = actionBar.newTab();

        String label1 = getResources().getString(R.string.hasbrouck);
        hasbrouckTab.setText(label1).setTabListener(
                new TabListener<Fragment_Has>(this, R.id.quadParent,
                        Fragment_Has.class));

        String label2 = getResources().getString(R.string.parker);
        parkerTab.setText(label2).setTabListener(
                new TabListener<Fragment_Parker>(this, R.id.quadParent,
                        Fragment_Parker.class));

        String label3 = getResources().getString(R.string.south);
        southTab.setText(label3).setTabListener(
                new TabListener<Fragment_South>(this, R.id.quadParent,
                        Fragment_South.class));

        actionBar.addTab(hasbrouckTab);
        actionBar.addTab(parkerTab);
        actionBar.addTab(southTab);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
        case R.id.action_settings:
            Toast.makeText(this, "Acton settings selected", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
        return true;
    }

    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.buttonBevier:
            Intent i = new Intent(this, DormInfo.class);
            String dorm = "Bevier";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonCrispell:
            i = new Intent(this, DormInfo.class);
            dorm = "Crispell";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonDeyo:
            i = new Intent(this, DormInfo.class);
            dorm = "Deyo";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonDuBois:
            i = new Intent(this, DormInfo.class);
            dorm = "DuBois";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonLefevre:
            i = new Intent(this, DormInfo.class);
            dorm = "DuBois";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonBouton:
            i = new Intent(this, DormInfo.class);
            dorm = "Bouton";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;
        case R.id.buttonBliss:
            i = new Intent(this, DormInfo.class);
            dorm = "Bliss";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonCapen:
            i = new Intent(this, DormInfo.class);
            dorm = "Capen";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonCollango:
            i = new Intent(this, DormInfo.class);
            dorm = "College/Shango";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonGage:
            i = new Intent(this, DormInfo.class);
            dorm = "Gage";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonScudder:
            i = new Intent(this, DormInfo.class);
            dorm = "Scudder";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonEsopus:
            i = new Intent(this, DormInfo.class);
            dorm = "Esopus";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;

        case R.id.buttonLenape:
            i = new Intent(this, DormInfo.class);
            dorm = "Lenape";
            i.putExtra(EXTRA_DORM, dorm);
            startActivity(i);
            break;
        }
    }
}

Activity B
package ege493.test.hawksnesttabs;


import android.app.ActionBar;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class DormInfo extends Activity {
    ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dorm);

        // Set up the action bar.

        actionBar = getActionBar(); // Get reference to ActionBar

        //Using a different Action Bar, the tabs work well, but...
        //I'm trying to get rid of the title/icon/options menu. The Theme.Holo.NoActionBar
        //causes it to crash, and I can't get an 'onCreateOptionsMenu' to work.
        //Trying to allow a menu to work through hitting the menu button on the phone, but I do not want an
        //option for it in the action bar, or an action bar at all (which, I currently have no action bar)
        //Goal for this:::: Use the menu button to bring you back to dorm selection if you are already in the app

        // 1. Enable ActionBar navigation tabs
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);

        // 2. Add the tabs
        Tab peopleTab = actionBar.newTab();
        Tab eventsTab = actionBar.newTab();
        Tab hoursTab = actionBar.newTab();

        String label1 = getResources().getString(R.string.ra_list);
        peopleTab.setText(label1).setTabListener(
                new TabListener<Fragment_RA>(this, R.id.dormParent,
                        Fragment_RA.class));

        String label2 = getResources().getString(R.string.dorm_events);
        eventsTab.setText(label2).setTabListener(
                new TabListener<Fragment_Events>(this, R.id.dormParent,
                        Fragment_Events.class));

        String label3 = getResources().getString(R.string.dorm_hours);
        hoursTab.setText(label3).setTabListener(
                new TabListener<Fragment_Hours>(this, R.id.dormParent,
                        Fragment_Hours.class));

        actionBar.addTab(peopleTab);
        actionBar.addTab(eventsTab);
        actionBar.addTab(hoursTab);

        //--------------------------------------------------------
        //Get the buttonID from the button that started the activity
        //--------------------------------------------------------

        /*Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_DORM);

        TextView tv = new TextView(this);
        tv.setTextSize(40);
        tv.setText(message);

        setContentView(tv);*/

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransacton = fragmentManager.beginTransaction();
        Fragment_RA detailsFragment = new Fragment_RA();
        //Fragment_Hours hoursFragment = new Fragment_Hours();
        //Fragment_Events eventsFragment = new Fragment_Events();
        Bundle b = new Bundle();
        b.putString(MainActivity.EXTRA_DORM, getIntent().getStringExtra(MainActivity.EXTRA_DORM));
        detailsFragment.setArguments(b);
        //fragmentTransacton.add(R.id.dormParent, detailsFragment);
        //hoursFragment.setArguments(b);
        //fragmentTransacton.add(R.id.dormParent, hoursFragment);
        //eventsFragment.setArguments(b);
        //fragmentTransacton.add(R.id.dormParent, eventsFragment);
        fragmentTransacton.commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
        case R.id.action_settings:
            Toast.makeText(this, "Acton settings selected", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
        return true;
    }

}

试图获得额外的 fragment
package ege493.test.hawksnesttabs;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment_RA extends Fragment{

/*  public static Fragment_RA newInstance(int index) {
        Fragment_RA f = new Fragment_RA();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }
*/
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View v = inflater.inflate(R.layout.people_fragment, null);
            TextView tv = (TextView) v.findViewById(R.id.tv);       
            Bundle b = getArguments();
            tv.setText("Details of " + b.getString(MainActivity.EXTRA_DORM));

            return v;
    }
}

编辑,我成功了

我弄清楚发生了什么。

我正在使用一种自定义 TabListener 类。我用这个:

how to initialize(pass arguments) fragments for action bar tabs?

它就像一个魅力,所以现在我的 Activity B 的代码,我只是添加了一个 peopleTab.setTag(b);在我将它们添加到操作栏之前,然后在我的 TabListener 类中添加
fragment = Fragment.instantiate(activity, fragmentClass.getName(), (Bundle) tab.getTag());

就像上面的链接解释的那样。我想我只是看得太远了!我倾向于用蚁丘造山……不过还是谢谢你的支持!

最佳答案

您还需要在 Activity 上 bundle 字符串。

Passing a bundle on startActivity

您是否检查过是否也有一个值被传递?您是否运行调试器以查看是否正在传递值?

关于java - 选项卡式导航,将 Intent 附加信息传递给 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691077/

相关文章:

java - JAXB 中对象标签之间的消息

java - 在计算机之间移动后启动应用程序时出现 IllegalStateException

java - Try-with-resources api pre 19

java - 如何从通用 JAXBElement<?延伸 >

java - 为什么我的 Spring @Autowired 字段为空?

java - 如何解决 "java.lang.UnsatisfiedLinkError: no AspriseOCR in java.library.path.."

android - 在 Eclipse 中使用的 float 操作按钮库

android - 在没有 .class 的情况下启动 Android 服务

android - 获取并保存使用 Intent.ACTION_GET_CONTENT 选择的任何文件

java - 当互联网连接失败时,AsyncTask doInBackground 返回空指针异常