简体   繁体   English

如何使用替换片段将值从活动传递到选项卡片段?

[英]How to pass value from activity to Tab Fragment using replace Fragment?

I have activity , which I take a value from it and pass it to Tab Fragment .. in the Tab Fragment ,I want to use this value to setText 我有活动,我从中获取一个值并将其传递给Tab Fragment中的Tab Fragment ..我想使用此值来setText

The Problem is How to take this value to the Tab Fragment ? 问题是如何将此值带到Tab片段? I always get this Exception java.lang.IllegalArgumentException: No view found for id ....for fragment Tab1 .. How to solve it ? 我总是收到此异常java.lang.IllegalArgumentException:找不到片段Tab1的id .....的视图。如何解决?

I used normal Tab activity in android studio and modified this method 我在android studio中使用了正常的Tab活动并修改了此方法

homee.java homee.java

public Fragment getItem(int position) {
        switch (position){
            case 0:
                Tab1 tab1 =new Tab1();
                return tab1;
            case 1:
                Tab2 tab2 =new Tab2();
                return tab2;
            case 2:
                Tab3 tab3 =new Tab3();
                return tab3;
        }
        return null ;
    }

this is my activity number.java 这是我的活动号码。java

public class number extends AppCompatActivity {
Button add,save;
TextView num;
int n;
String stringNum;

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

    add =  findViewById(R.id.idadd);
    save =  findViewById(R.id.idsave);
    num = findViewById(R.id.idnum);

    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //simple method
            n = Integer.parseInt(num.getText().toString());
            num.setText(++n +"");
        }
    });

    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stringNum= num.getText().toString(); 
// I want to pass this value to Tab1 Fragment by replaceFragment or by any 
//way
            Bundle bundle = new Bundle();
            bundle.putString("key", stringNum);
            Tab1 myFragment = new Tab1();
            myFragment.setArguments(bundle);


     getSupportFragmentManager().beginTransaction().replace
     (R.id.container,myFragment).commit();
            finish();
        }
    });
}}

this is Tab1 child of Tab activity 这是Tab活动的Tab1子级

public class Tab1 extends Fragment {

Button get,update;
TextView txt;

public Tab1(){}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tab1, container, false);

    get = view.findViewById(R.id.idget);
    update = view.findViewById(R.id.idup);
    txt = view.findViewById(R.id.textView);

    get.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(getContext(), number.class);
            startActivity(in);
        }
    });

    update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String Number= getArguments().getString("key").toString();
            //here the problem
            txt.setText(Number);
        }
    });

        return view;
        }
    }

activity_homee.xml activity_homee.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="eg.noname.opo.homee">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/appbar_padding_top"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_weight="1"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:title="@string/app_name">

    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabItem
            android:id="@+id/tabItem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/tab_text_1" />

        <android.support.design.widget.TabItem
            android:id="@+id/tabItem2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/tab_text_2" />

        <android.support.design.widget.TabItem
            android:id="@+id/tabItem3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/tab_text_3" />

    </android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

tab1.xml tab1.xml

<?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/fra">

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="111dp"
    android:text="TextView"
    android:textAlignment="center"
    android:textSize="30sp" />

<Button
    android:id="@+id/idget"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="88dp"
    android:text="get" />

<Button
    android:id="@+id/idup"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="update" />
</LinearLayout>

Edit I solved it by call static method which return this value , but still I should press on Button in Fragment to update the value to the new one , I am trying to find a way to update the value automatically when I pass it from my activity .. any help ? 编辑我通过调用返回该值的静态方法解决了它,但仍然应该按Fragment中的Button将值更新为新值,我试图找到一种方法,当我从活动传递值时自动更新该值..有什么帮助吗?

in activity number.java 在活动号

  in onCreate method just call
  String Number= getArguments().getString("key").toString();
        //here the problem
        txt.setText(Number)

You just have to pass value while calling Fragment in getItem() method. 您只需在getItem()方法中调用Fragment时传递值。

public Fragment getItem(int position) {
    switch (position){
        case 0:
              Tab1 tab1= new Tab1();
              Bundle bundle = new Bundle();
              bundle.putString("name", name);
              tab1.setArguments(bundle);
              return tab1;
        case 1:
            Tab2 tab2= new Tab2();
            Bundle bundle = new Bundle();
            bundle.putString("mobile", mobile);
            tab2.setArguments(bundle);
            return tab2;
        case 2:
            Tab3 tab3= new Tab3();
            Bundle bundle = new Bundle();
            bundle.putString("email", email);
            tab3.setArguments(bundle);
            return tab3;
    }
    return null ;
}

You can check it in next fragments simply by: 您可以通过以下方法在下一个片段中对其进行检查:

if( getArguments() != null) {
        name = getArguments().getString("name");

Hope this helps u. 希望这对你有帮助。

Just pass following bundle with your fragment which one you want to pass data : 只需将以下捆绑包与您要传递数据的片段一起传递:

Bundle data = new Bundle();//create bundle instance
data.putString("key_value", "String to pass");//put string to pass with key 
fragmentName.setArguments(data);//Set bundle data to fragment

You can retrieve data with following code in next fragment : 您可以在下一个片段中使用以下代码检索数据:

 String getArgument = getArguments().getString("data");
 text.setText(getArgument); //set string over textview

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM