首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问片段中的视图

访问片段中的视图
EN

Stack Overflow用户
提问于 2013-12-30 14:32:10
回答 2查看 1.3K关注 0票数 0

我在访问片段中的视图时遇到了麻烦。在下面的示例中,我无法访问片段中的第二个按钮(例如,当我尝试b2.setText("test")时,findViewById似乎返回NULL,应用程序崩溃),但是当我将它直接添加到activity_main.xml中时,它确实工作。

以下是代码:

MainActivity.java

代码语言:javascript
复制
public class MainActivity extends Activity 
{

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

    final Button fragmentButton = (Button)findViewById(R.id.iMainButton);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.iMainInnerLLContainer, new TestFragment());         
    ft.commit();

    final Button b2 = (Button)findViewById(R.id.iTestFragmentInnerButton);
    if(b2 == null) { Log.d("MainActivity.java:", "b2 is null"); } 
    else { Log.d("MainActivity.java:", "b2 is NOT null"); } 

    fragmentButton.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            // do stuff here
        }
    });
}

}

activity_main.xml

代码语言:javascript
复制
<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"
android:id="@+id/iMainRootLinearLayoutContainer"
android:orientation="vertical" 
>

<Button
    android:id="@+id/iMainButton"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="Add fragment..." 
/>    

<LinearLayout
    android:id="@+id/iMainInnerLLContainer"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="vertical"
>
    <!-- Fragment goes here, can reference button if it is added here manually -->
</LinearLayout>

</LinearLayout>

TestFragment.java

代码语言:javascript
复制
public class TestFragment extends Fragment 
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.ltestfragment, container, false);
}
}

ltestfragment.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:id="@+id/iTestFragmentOuterLinearLayout"
>

<Button
    android:id="@+id/iTestFragmentInnerButton"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="This is my test fragment button." 
/>
</LinearLayout>

我想我在这里错过了一些非常基本的东西,我很想知道这可能是什么。

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2013-12-30 14:51:15

我认为你需要在你的片段中设置一个文本交换器。

代码语言:javascript
复制
public class FragmentA extends Fragment {

TextChangeListener listener;

public interface TextChangeListener {
    public void onTextChange(CharSequence newText);
}

代码语言:javascript
复制
public void setTextChangeListener(TextChangeListener listener) {
    this.listener = listener;
}

然后,在您的活动中,设置侦听器:

代码语言:javascript
复制
public class ActivityAB extends FragmentActivity {

FragmentA fragmentA;
FragmentB fragmentB;

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

    FragmentManager manager = getSupportFragmentManager();
    fragmentA = (FragmentA) manager.findFragmentById(R.id.fragmentA);
    fragmentB = (FragmentB) manager.findFragmentById(R.id.fragmentB);

    fragmentA.setTextChangeListener(new TextChangeListener() {

        @Override
        public void onTextChange(CharSequence newText) {
            fragmentB.updateTextValue(newText);
        }
    });
}

}

票数 0
EN

Stack Overflow用户

发布于 2013-12-31 12:46:00

实现一个接口来侦听来自其活动的片段的事件。

代码片段:-

代码语言:javascript
复制
   public class TestFragment extends Fragment  
   {
       public interface OnClickListener 
       {
            public void onButtonClicked(<data type><data>);  
       }

       b2.setOnClickListener(new OnClickListener() {
       @Override    
            public void onClick(View v) {
            listener.onButtonClicked(<<pass some values here>>);
            }
       });
   }

主要代码:-

代码语言:javascript
复制
   MainActivity extends FragmentActivity implements TestFragment.OnClickListener, 
   {
        @Override
        public void onButtonClicked(<<receive the pased data here>>) {

        //do some stuff here with the received data after the button is clicked
    } 
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20841572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档