java - 访问 Activity fragment 上的布局组件?

标签 java android

我使用 fragment 更改了三个选项卡中的 activity_main.xml 布局。我想像以前一样访问 MainActivity 中的所有选项卡组件,但出现 NullPointersException。我在这里做错了什么。谢谢!

我的 fragment 代码:

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

public class FragMent3 extends Fragment {

    EditText textBox;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.logbook_view, null);

        return view;
    }   
}

第三个布局标签的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="Send request"
        android:onClick="onSendButtonClicked" />

   <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Write request.."
        android:ems="10" />

</LinearLayout>

MainActivity 部分代码:

@SuppressLint("NewApi")
public class MainActivity extends Activity implements TabListener {
    RelativeLayout rl;


    EditText textBox;
    static int x;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textBox = (EditText)findViewById(R.id.editText1);

        try {
            rl = (RelativeLayout) findViewById(R.id.mainLayout);

            fragMentTra = getFragmentManager().beginTransaction();
            ActionBar bar = getActionBar();
            bar.addTab(bar.newTab().setText("Info").setTabListener(this));
            bar.addTab(bar.newTab().setText("Pilot").setTabListener(this));
            bar.addTab(bar.newTab().setText("Logbook").setTabListener(this));

            bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
                    | ActionBar.DISPLAY_USE_LOGO);
            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            bar.setDisplayShowHomeEnabled(true);
            bar.setDisplayShowTitleEnabled(false);
            bar.show();

        } catch (Exception e) {
            e.getMessage();
        }
        /**
         * Hiding Action Bar
         */
    }

    FragMent1 fram1;
    FragmentTransaction fragMentTra = null;
    FragMent2 fram2;
    FragMent3 fram3;


    /*
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }*/

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {

        if (tab.getText().equals("Info")) {
            try {
                rl.removeAllViews();
            } catch (Exception e) {
            }
            fram1 = new FragMent1();
            fragMentTra.addToBackStack(null);
            fragMentTra = getFragmentManager().beginTransaction();
            fragMentTra.add(rl.getId(), fram1);
            fragMentTra.commit();
        } else if (tab.getText().equals("Pilot")) {
            try {
                rl.removeAllViews();
            } catch (Exception e) {
            }
            fram2 = new FragMent2();
            fragMentTra.addToBackStack(null);
            fragMentTra = getFragmentManager().beginTransaction();
            fragMentTra.add(rl.getId(), fram2);
            fragMentTra.commit();
        } else if (tab.getText().equals("Logbook")) {
            try {
                rl.removeAllViews();
            } catch (Exception e) {
            }
            fram3 = new FragMent3();
            fragMentTra.addToBackStack(null);
            fragMentTra = getFragmentManager().beginTransaction();
            fragMentTra.add(rl.getId(), fram3);
            fragMentTra.commit();
        }

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

    }

    public void onSendButtonClicked(View view) {

        textBox.setText("some text on third tab EditText");
    }

日志:

05-06 12:42:19.993: E/AndroidRuntime(29991): FATAL EXCEPTION: main
05-06 12:42:19.993: E/AndroidRuntime(29991): java.lang.IllegalStateException: Could not execute method of the activity
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.view.View$1.onClick(View.java:3103)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.view.View.performClick(View.java:3574)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.view.View$PerformClick.run(View.java:14293)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.os.Handler.handleCallback(Handler.java:605)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.os.Looper.loop(Looper.java:137)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.app.ActivityThread.main(ActivityThread.java:4441)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at java.lang.reflect.Method.invokeNative(Native Method)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at java.lang.reflect.Method.invoke(Method.java:511)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at dalvik.system.NativeStart.main(Native Method)
05-06 12:42:19.993: E/AndroidRuntime(29991): Caused by: java.lang.reflect.InvocationTargetException
05-06 12:42:19.993: E/AndroidRuntime(29991):    at java.lang.reflect.Method.invokeNative(Native Method)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at java.lang.reflect.Method.invoke(Method.java:511)
05-06 12:42:19.993: E/AndroidRuntime(29991):    at android.view.View$1.onClick(View.java:3098)
05-06 12:42:19.993: E/AndroidRuntime(29991):    ... 11 more
05-06 12:42:19.993: E/AndroidRuntime(29991): Caused by: java.lang.NullPointerException
05-06 12:42:19.993: E/AndroidRuntime(29991):    at com.example.colibri2bbui.MainActivity.onSendButtonClicked(MainActivity.java:201)
05-06 12:42:19.993: E/AndroidRuntime(29991):    ... 14 more

最佳答案

您执行“TAB”实现的方式完全错误。首先,你应该使用 FrameLayout作为父 View 添加/替换您的 Fragments .第二件事是 onTabSelected 中的逻辑应该改变。下面是一个示例,它是在 ActionBar 中使用 Tab Navigation 的正确方法。

首先创建您的 main.xml,您的 fragment 将添加/附加到其中:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

其次,您可以创建选项卡并添加 TabListener对他们:

mMyActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

ActionBar.Tab mFirstTab = mMyActionBar.newTab();
mFirstTab.setText("First Tab");
mFirstTab.setTabListener(this);
mMyActionBar.addTab(mFirstTab);

ActionBar.Tab mSecondTab = mMyActionBar.newTab();
mSecondTab.setText("Second Tab");
mSecondTab.setTabListener(this);
mMyActionBar.addTab(mSecondTab);

ActionBar.Tab mThirdTab = mMyActionBar.newTab();
mThirdTab.setText("Third Tab");
mThirdTab.setTabListener(this);
mMyActionBar.addTab(mThirdTab);

并像这样创建你的 TabListener :

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // Check if the fragment is already initialized
    if (mFirstTab == null) {
        // If not, instantiate and add it to the activity
        mFirstTab = Fragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFirstTab, mTag);
    } else {
        // If it exists, simply attach it in order to show it
        ft.attach(mFirstTab);
    }
}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if (mFirstTab != null) {
        // Detach the fragment, because another one is being attached
        ft.detach(mFirstTab);
    }
}

public void onTabReselected(Tab tab, FragmentTransaction ft) {
    // User selected the already selected tab. Usually do nothing.
}

关于NullPointerException在你的代码中,我可以看到你的 EditText : textBox = (EditText)findViewById(R.id.editText1);你正试图在你的 MainActivity 中使用它在您的第三个选项卡布局中声明。这EditText应在您的 FragMent3 中声明和使用, 不在 MainActivity .

希望这个回答对你有帮助!

关于java - 访问 Activity fragment 上的布局组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396755/

相关文章:

android - 构建应用程序时出错 : app:transformDexArchiveWithDexMergerForDebug

java - 带接口(interface)的匿名类

java - 使用标记进行文件解析

java - 剪辑播放 + 音量控制 = 流行音乐

php - 以 1000 个用户为一组向所有 10000 个用户发送 gcm 消息

android - 如何禁用 Android 上的切换按钮?

java - Twisted python 服务器和 Java 聊天

java - Java 中 httpURLconnection 的 ASCII 响应?

java - 主要 Activity 未设置主题

android - arm_neon.h 是否缺少所有 float16_t 类型?