通过界面更新/设置文本

Posted

技术标签:

【中文标题】通过界面更新/设置文本【英文标题】:Update/set text through interface 【发布时间】:2017-11-03 14:10:41 【问题描述】:

我正在尝试在我的 MainActivity 选项卡上的文本视图中设置通知的数量/计数。我已经通过使用接口成功地获取了我的片段和活动之间的数据。每次我收到通知时,它都会将号码传递给我的 MainActivity。我可以显示数字,但我不知道如何在我的 textview 上实现和设置。

public void onDataPass(String data) Log.d("LOG","你好" + 数据);

我能够从上面的代码中获得价值。下面是我的日志:

06-02 07:02:16.213 12310-12310/ D/LOG: hello 通知数:1

06-02 07:03:26.697 12310-12310/ D/LOG: hello 通知数量:2

06-02 07:04:35.718 12310-12310 D/LOG: hello 通知数量:3

但是,我试图在我的 textview 上设置这个数字。即使在将我的“数据”声明为公开之后,我也会得到空值。我不确定如何将数据的值放入 textview 中。有人可以帮我解决这个问题吗?

   if(tab != null && tab.getCustomView() != null) 
        TextView b = (TextView) tab.getCustomView().findViewById(R.id.badge);
        if (b != null) 
            b.setText(data);
            Log.d("hello1", "test1" + data);
        

以下是我的完整 MainActivity 代码: MainActivity.java

public class MainActivity extends AppCompatActivity implements NotificationFragment.OnDataPass 
    public String data;
    private String name;
    private String email;
    private TextView badgeText;

    public void onDataPass(String data) 
        Log.d("LOG","hello " + data);
    

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


        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ActionBar ab = getSupportActionBar();
        ab.setTitle("Test");

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        if (viewPager != null) 
            setupViewPager(viewPager);
        

        final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);



        final int[] tabIcon = new int[]
                R.drawable.tab_item_remit_state,
                R.drawable.tab_item_account_state,
                R.drawable.tab_item_notification,
        ;

        tabLayout.getTabAt(0).setIcon(tabIcon[0]);
        tabLayout.getTabAt(1).setIcon(tabIcon[1]);
        tabLayout.getTabAt(2).setIcon(tabIcon[2]);

        TabLayout.Tab tab = tabLayout.getTabAt(2);
        tab.setCustomView(R.layout.badged_tab);


        if(tab != null && tab.getCustomView() != null) 
            TextView b = (TextView) tab.getCustomView().findViewById(R.id.badge);
            if (b != null) 
                b.setText(data);
                Log.d("hello1", "test1" + data);
            
            final View v = tab.getCustomView().findViewById(R.id.badgeCotainer);
            View a = tab.getCustomView();

            a.setOnTouchListener(new View.OnTouchListener() 
                @Override
                public boolean onTouch(View a, MotionEvent event) 
                    v.setVisibility(View.INVISIBLE);
                    return false;
                
        );

        if (v != null ) 
            v.setVisibility(View.VISIBLE);

        
    

【问题讨论】:

有几件事,在 onDataPass() 函数中看不到将数据分配给活动的类级别变量的部分,您只是在记录吗?另外我认为当 onCreate 方法被调用时,数据不会出现在活动的类级别数据变量中。您可能需要手动调用将在 onDataPass() 函数中设置选项卡文本值的函数。 @SAJ 是的,我只是在记录。如何在我的 onCreate 中调用 onDataPass 方法?或者如果我在 onDataPass 方法下设置文本是否有可能?我只登录 onDataPass 因为我的标签是 onCreate 。 是的,您需要在 onDataPass 方法中添加 setTabText 逻辑。你不应该调用 onCreate 方法。将选项卡文本逻辑提取到一个单独的函数中,该函数设置并从 onDataPass 调用该函数。 谢谢!我将尝试在我的 onDataPass 方法上实现 setText on tab 逻辑。 【参考方案1】:

创建界面

public interface OnDataReceiverListener 
   void onDataReceived(String myData);

在类中声明接口,您可以在其中获取需要在其他活动中传递的数据并为此创建设置器...假设类名称为 MyReceiver.java

private static OnDataReceiverListener onDataReceiveListener;
public static void setOnDataReceiveListener(OnDataReceiverListener _listener) 
    onDataReceiveListener = _listener;

在 Activity 的 onCreate() 中调用这个 setter,假设 MainActivity

MyReceiver.setOnDataReceiveListener(this);

// This will overided
@Override
public void onDataReceived(String myData) 
    // Process your data 
    TextView b = (TextView) mTabLayout .getTabAt(2).getCustomView().findViewById(R.id.badge);
    if (b != null) 
        b.setText(myData);
           

不要忘记将 setter 设置为 null,因为接口是静态的。在onDestroy()做这个工作

public void onDestroy() 
   MyReceiver.setOnDataReceiveListener(null);
   super.onDestroy();

总结, 将mTabLayout 声明为全局实例,在onDataReceived 回调中设置标记文本。

【讨论】:

感谢您提供接口示例。实际上,我已经在使用 Interface 来传递数据,并且我也能够获取数据。我只是想在选项卡上的 textview 上设置数据,但我不知道如何在我的 onDatapass 方法上调用选项卡,因为选项卡是 onCreate。我正在尝试在 onDatapass 方法下实现逻辑。我做的另一种方法是设置数据 onCreate 但不知道如何在 onCreate 中调用该方法。抱歉,如果我的问题让您感到困惑。

以上是关于通过界面更新/设置文本的主要内容,如果未能解决你的问题,请参考以下文章

通过延迟一个字符的相同值更新文本输入状态和AJAX搜索[重复]

如何通过命令行更新 GitHub 访问令牌

如何从界面设置状态?

Flutter 仿抖音效果 (二) 界面布局

通过父组件的onClick更新组件状态

vs2008怎么把语言设置中文设置