【问题标题】:How to set public textview in activity from fragment?如何在片段的活动中设置公共文本视图?
【发布时间】:2020-03-01 10:12:31
【问题描述】:

我想在片段的活动中设置 textview 的文本。我就是这样做的。

MainActivity.java

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    public TextView textViewNotification;

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

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        textViewNotification = (TextView) MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_notification));
    }
}

HomeFragment.java

public class HomeFragment extends Fragment {

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

        ((MainActivity)getActivity()).getSupportActionBar().setTitle("PIT IAI & FIP Regional");

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_home, container, false);

        MainActivity activity = (MainActivity) getActivity();
        activity.notification.setText("This is a test"); // => got error here.

        return root;
    }
}

但它没有工作。这是我得到的错误:

android.content.res.Resources$NotFoundException: String resource ID #0x1
    at android.content.res.Resources.getText(Resources.java:348)
    at android.widget.TextView.setText(TextView.java:5846)

究竟如何从片段中获取和设置活动的公共属性?不可能吗?请帮忙。

【问题讨论】:

  • 将“This is a test”移动到字符串资源并用R.string.test替换它

标签: java android android-fragments android-activity


【解决方案1】:

假设您想根据某些操作将文本发送到活动。

您可以使用接口,首先在您的片段中创建一个公共接口,然后在其中添加一个方法,该方法采用一个字符串参数

public interface CommunicateWithActivity{
   void onCommunicate(String s)
 }

,声明一个 CommunicateWithActivity 类型的全局变量 mListener,

private CommunicateWithActivity mListener;

然后覆盖 onAttach 并在 try/catch 块内

@Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mListener = (CommunicateWithActivity) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "CommunicateWithActivity implementation in Activity is required");
        }

    } 

然后在活动中实现接口,在活动中覆盖“onComunicate(String s)”方法,您将在方法中获取您的字符串。

@Override
    public void onCommunicate(String s) {
      //do whatever you want
    }

【讨论】:

  • 最好从构造函数中获取。这样,它允许用户在同一个活动中使用片段的多个实例。很少见,但易于阅读和实施。
【解决方案2】:

Henry Gunawan 您的 MainActivity 没有任何称为通知的公共字段,您实际上将其命名为 textViewNotification。

此外,我在您的代码中看到了一些不好的做法

  1. 避免声明公共字段,而是使用 getter 和 setter 来访问它们

  2. 假设它是主机的片段始终是 MainActivity 实例,并且它有一个名为 notification 的字段,这不是一个好的做法,片段应该是一个独立的单元,片段不应依赖于其主机的具体情况活动,因为它们可能是任何活动的宿主,因此这是对片段的滥用,如果您希望宿主活动为您做某事,如 Amr Sakr 所解释,则应使用回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多